2

追加の変数を使用せずに、catch句でキャッチされた例外を見つけて、finally句から再度スローすることは可能ですか?

public void exceptionalFunction() throws Exception
 {
    try
     {
         // exception causing code
     }
    catch (TypeAException e)
     {
        // exception specific logic
     }
    catch (TypeBException e)
     {
         // exception specific logic        
     }
    catch (TypeCException e)
     {
        // exception specific logic        
     }
    finally
     {
         // throw the exception that was caught, if one was caught. 
     }
 }
4

3 に答える 3

6

追加の変数を使用せずにはいられません。追加の変数を使用しないと、例外固有のロジックの後にのみ例外を再度スローできます。

catch (TypeAException e)
{
    // exception specific logic 
    throw e;       
}
catch (TypeBException e)
{
    // exception specific logic 
    throw e;       
}
catch (TypeCException e)
{
    // exception specific logic 
    throw e;       
}
于 2012-08-24T18:51:19.690 に答える
2

それらをfinally節でキャッチすることはできません。キャッチの範囲と最終的には別です。ただし、複数の例外処理コードを記述したくないので、Java7で導入された機能を使用することをお勧めします。

....
....
catch (Exception1|Exception2|Exception2 e){
    //determine type and handle accordingly
}

java6以前を使用している場合、コーディングの労力を節約する唯一の方法は、メソッドを介してそれらを処理することです。

....
....
catch(Exception1 e){
    handle(e);
}
catch(Exception2 e){
    handle(e);
}

次に、instanceofを使用して例外のタイプを判別し、自分のことを実行できます。

于 2012-08-24T19:09:37.090 に答える
1

私はtibtofに同意する必要があります。

各catchブロックの実装ロジックの後に例外を再スローするのではなく、finallyブロックで例外を再スローすることは意味がありません。そうしても、何も得られません。したがって、彼は正しい解決策です。

一般的に言えば、この方法で行う方がよいでしょう。これは、毎回より具体的な例外を宣言し、毎回これらを呼び出しスタックに戻すことで拡張できるためです。独自のカスタム例外タイプを作成して、次のようにします。

catch (TypeAException e) 
{ 
    // exception specific logic  
    throw new myCustomException("Custom message " + e.getMessage);      
} 

毎回。

お役に立てば幸いです。

于 2012-08-24T19:11:16.090 に答える