Хотя обычно ловить Throwable - плохая практика (что объясняется многочисленными ответами на этот вопрос), сценарии, в которых ловля Throwable
полезна, довольно распространены. Позвольте мне объяснить один такой случай, который я использую на своей работе, на упрощенном примере.
Рассмотрим метод, который выполняет добавление двух чисел и после успешного добавления отправляет оповещение по электронной почте определенным людям. Предположим, что возвращаемый номер важен и используется вызывающим методом.
public Integer addNumbers(Integer a, Integer b) {
Integer c = a + b; //This will throw a NullPointerException if either
//a or b are set to a null value by the
//calling method
successfulAdditionAlert(c);
return c;
}
private void successfulAdditionAlert(Integer c) {
try {
//Code here to read configurations and send email alerts.
} catch (Throwable e) {
//Code to log any exception that occurs during email dispatch
}
}
Код для отправки оповещений по электронной почте считывает множество конфигураций системы, и, следовательно, из этого блока кода могут быть различные исключения. Но мы не хотим, чтобы какое-либо исключение, обнаруженное во время отправки оповещения, распространялось на метод вызывающей стороны, поскольку этот метод просто связан с суммой двух целочисленных значений, которые он предоставляет. Следовательно, код для отправки оповещений по электронной почте помещается в блок try-catch
, где Throwable
перехватывается, а любые исключения просто регистрируются, что позволяет продолжить остальную часть потока.