Зачем нужно пробрасывать исключения? Почему может быть нельзя из сразу обработать?
Чтобы обрабатывать ошибки централизованно.
Вот допустим у Вас есть процесс, который разбирает определенные файлы и кладет их в базу данных. Файлы большие и сложные, поэтому логика разбита по сотне-другой классов, в каждом из которых по несколько методов.
Драйвер базы данных предусматривает, что база может оказаться недоступна и все методы, которые работают с БД выбрасывают 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 для этого как правило используются исключения. Проверяемые исключения как раз и являются попыткой обязать разработчиков обрабатывать ошибки.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть WebView который подгружает локальный (хранящийся в память приложения) файл indexhtml
Я использую Spring-ws для написания SOAP-клиентаПри этом на сервере используются две wsdl для тестовой и продакшн сред, одинаковые по содержанию,...
В чем проблема? Comple error : Compilation failed; see the compiler error output for details