Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

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

#java #исключения #методы #обработка_ошибок


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


Ответы

Ответ 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 для этого как правило используются исключения. Проверяемые исключения как раз и являются попыткой обязать разработчиков обрабатывать ошибки.

Комментариев нет:

Отправить комментарий