0

次のコードがプログラム (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 プログラマーが通常、同様のケースをどのように処理するのか疑問に思っています。

例外に関する一般的な考えも感謝します

4

2 に答える 2

0

method の現在の設計に満足していて、メソッドz()が必要で、 で何か悪いことが起こったことを「知る」y()場合は、飲み込んだ後に例外を再スローすることができます。x()z()z()

public void z() {
    try {
        // some code here, that might throw exceptions.
    } catch (SomeException | SomeOtherException e) {
        // handle the exception and then rethrow it
        logger.log("An exception happened in z().");
        throw e;
    }
}

public void y() {
    try {
        z();
    } catch(Exception e) {
        // handle problem with z() and rethrow the exception
        logger.log("An exception happened when calling z().");
        throw e;
    }
}

public void x() {
    try {
        y();
    } catch(Exception e) {
        // handle problem with y()
        logger.log("An exception happened when calling y().");
    }
}
于 2016-04-19T14:11:55.253 に答える