Представьте себе следующий код как часть некоторой программы (Java):Цепной исключения, перехват исключений, чтобы бросить новые
function z(){
try{
//some code here, that might throw exceptions.
}catch (SomeException | SomeOtherException e){
//some exception handling here.
}
function y(){
z();
}
function x(){
y();
}
И представьте себе, что функции х и у не будет выполняться как задумано, если исключения SomeException или SomeOtherException выбрасывается внутри функции z. Мы хотим написать наш код таким образом, чтобы функции x и y знали, что Исключения были выбраны функцией z и заставить их действовать соответственно. Каков наилучший способ сделать это?
function z() thrown FunctionZFailedException{
try{
//some code here, that might throw exceptions.
}catch (SomeException | SomeOtherException e){
throw new FunctionZFailedException();
}
}
function y() throws FunctionYFailedException{
try{
z();
}catch (FunctionZFailedException e){
throw new FunctionYFailedException();
}
}
function x(){
try{
y();
}catch (FunctionYFailedException e){
//Do something, like alerting user that something went wrong.
}
}
Является ли это слишком чрезмерными, что объявляет новые исключения с единственной целью «пересылки» другие исключения на более высокий уровень?
Я думаю, мы могли бы просто позволить SomeException и SomeOtherException взлететь и поймать их внутри функции x. Но imo, который может компенсировать менее читаемый код, например, если исключения, обнаруженные в функции z, являются SQLException и NoSuchAlgorithmException, а функция y является функцией login(). Затем функция x попытается вызвать login() и либо поймать SQLException | NoSuchAlgorithmException, если они позволяют этим исключениям просто взлетать на самый высокий уровень или ловить исключение LoginFailedException, если мы немедленно поймаем каждое исключение и попробуем перебросить новые исключения. Похоже, что catching LoginFailedException делает более удобочитаемый код.
Имо оба пути имеют свои минусы (менее читаемый код и введение многих исключений), и мне интересно, как подобные случаи обычно обрабатываются опытными программистами Java.
Любые общие мысли об исключениях также оценили спасибо, ребята
В большинстве случаев вы хотите включить исходное исключение («причина»): 'catch (FunctionZFailedException e) { throw new FunctionYFailedException (e); } ' – JimmyB