Зачем нужно пробрасывать исключения?

104
06 апреля 2021, 22:20

Зачем нужно пробрасывать исключения? Почему может быть нельзя из сразу обработать?

Answer 1

Чтобы обрабатывать ошибки централизованно.

Вот допустим у Вас есть процесс, который разбирает определенные файлы и кладет их в базу данных. Файлы большие и сложные, поэтому логика разбита по сотне-другой классов, в каждом из которых по несколько методов.

Драйвер базы данных предусматривает, что база может оказаться недоступна и все методы, которые работают с БД выбрасывают DatabaseKaputException. Т.к. разработчики драйвера фанатики, с садисткими наклонностями DatabaseKaputException — проверяемое исключение.

Теперь, если все исключения обрабатывать на месте, то каждый метод, работающий с БД будет содержать try/catch:

public Result someMethod() {
   try{
      //получаем результат из БД
   } catch(DatabaseException de) {
      //а вдруг база упала?
   }
}

Проблема с таким подходом в том, что «низовые» классы понятия не имеют, что им делать если база умерла. В этом случае нужно перейти к самому верхнему классу и останавливать весь процесс. Поэтому если исключения не пробрасывать, то каждый метод должен будет определять какой-то код ошибки и передавать его вверх.

public ResultWithException someMethod() {
   ResultWithException result;
   try{
      //нормальный код
      result.setValue(...);
   } catch(DatabaseException de) {
      //Обрабатываем, возвращаем результат с ошибкой
      result.setError(...);
   }
}

И при каждом вызове метода нужно будет проверять не оборвался ли он:

ResultWithException result = someObj.someMethod();
//а ты точно выполнился?
if(result.getError()==null) {
    //передаем сообщение об ошибке наверх
}

В результате получится тот же механизм пробрасывания исключений, только самописный и более многословный.

Пробрасывание позволяет обрабатывать исключение в том классе, который может принять адекватное решение по ошибке. При этом такого класса может и не быть. Если приложение работает с БД напрямую, то не всегда оправданно писать для него удобную систему обработки ошибок подключения. В таком случае исключение можно пробросить на самый верх.

В принципе есть языки программирования (C, Rust) которые обрабатывают ошибки в основном через возвращаемые значения (коды ошибок, специальные типы). В Java для этого как правило используются исключения. Проверяемые исключения как раз и являются попыткой обязать разработчиков обрабатывать ошибки.

READ ALSO
WebView API 28 не работает

WebView API 28 не работает

Есть WebView который подгружает локальный (хранящийся в память приложения) файл indexhtml

103
Использование разных targetNamespace для одного Wsdl

Использование разных targetNamespace для одного Wsdl

Я использую Spring-ws для написания SOAP-клиентаПри этом на сервере используются две wsdl для тестовой и продакшн сред, одинаковые по содержанию,...

102
Room Entity Annotation

Room Entity Annotation

В чем проблема? Comple error : Compilation failed; see the compiler error output for details

89