Это плохая практика ловить Throwable? - PullRequest
93 голосов
/ 21 мая 2011

Это плохая практика ловить Throwable?

Например, что-то вроде этого:

try {
    // Some code
} catch(Throwable e) {
    // handle the exception
}

Это плохая практика или мы должны быть как можно более конкретными?

Ответы [ 14 ]

0 голосов
/ 27 июля 2018

Вообще говоря, вы хотите не ловить Error с, но я могу вспомнить (по крайней мере) два конкретных случая, когда это уместно сделать:

  • Вы хотите закрыть приложение в ответ на ошибки, особенно AssertionError, которые в противном случае безвредны.
  • Реализуете ли вы механизм пула потоков, аналогичный ExecutorService.submit () , который требует от вас пересылать исключения обратно пользователю, чтобы они могли его обработать.
0 голосов
/ 04 ноября 2017

Throwable - это суперкласс всех ошибок и исключений. Если вы используете Throwable в предложении catch, он не только перехватывает все исключения, но и все ошибки. Ошибки генерируются JVM для указания серьезных проблем, которые не предназначены для обработки приложением. Типичными примерами этого являются OutOfMemoryError или StackOverflowError. Обе они вызваны ситуациями, которые находятся вне контроля приложения и не могут быть обработаны. Так что вы не должны ловить Throwables, если вы не уверены, что это будет только исключение из Throwable.

0 голосов
/ 15 сентября 2017

Если мы используем throwable , то оно покрывает Ошибка и все.

Пример.

    public class ExceptionTest {
/**
 * @param args
 */
public static void m1() {
    int i = 10;
    int j = 0;
    try {
        int k = i / j;
        System.out.println(k);
    } catch (Throwable th) {
        th.printStackTrace();
    }
}

public static void main(String[] args) {
    m1();
}

}

Выход:

java.lang.ArithmeticException: / by zero
at com.infy.test.ExceptionTest.m1(ExceptionTest.java:12)
at com.infy.test.ExceptionTest.main(ExceptionTest.java:25)
0 голосов
/ 16 июня 2015

Хотя обычно ловить 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 перехватывается, а любые исключения просто регистрируются, что позволяет продолжить остальную часть потока.

...