次のコードがプログラム (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();
}
また、関数 z 内で例外 SomeException または SomeOtherException がスローされた場合、関数 x および y が意図したとおりに実行されないことを想像してください。関数 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 をキャッチする場合 (各例外をすぐにキャッチして新しい例外をスローさせる場合)。LoginFailedException をキャッチすると、コードが読みやすくなるようです。
どちらの方法にも短所があり (読みにくいコードと多くの例外を導入する)、経験豊富な Java プログラマーが通常、同様のケースをどのように処理するのか疑問に思っています。
例外に関する一般的な考えも感謝します