Универсального признака нет, там бывают разные ошибки. Например, "деление на ноль", "синус от слишком большого числа (когда шаг дискретности числа больше, чем период синуса)" и другие варианты; правда, отсутствуют многие ошибки, свойственные компилируемым языкам программирования, типа "выход за границу массива".
А вот ошибки типа "программа попыталась открыть несуществующй или запретный для неё файл" - я так понимаю, catch не вызывают - такие операции просто возвращают код неудачного завершения, и их надо обрабатывать в основном потоке.
В первом приближении можно сказать примерно так: переход к catch возникает в случае, когда без catch программа должна вывалиться с сообщением "программа совершила недопустимую операцию", как-то так.
Это не точное соответствие, а пояснение для первичного понимания.