2016-04-19 1 views
0

をスローする例外をキャッチ、例外の連鎖SomeOtherExceptionは関数z内にスローされます。 関数xとyが関数zで例外がスローされたことを知って、それらを適切に動作させるようにコードを記述したいと思います。 これを行うにはどうすればよいですか?は、いくつかのプログラム(javaの)の一部として、次のコードを想像して、新しいものに

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の中にキャッチすることもできると思います。しかし、例えば、関数zで捕捉された例外がSQLExceptionとNoSuchAlgorithmExceptionであり、関数yがlogin()関数である場合、読みにくいコードを補うかもしれないimo。

次に、関数xはlogin()を呼び出そうとし、SQLExceptionをキャッチします。 NoSuchAlgorithmException、これらの例外を単に最高レベルまで飛ばすか、LoginFailedExceptionをキャッチする場合、それぞれの例外をただちに捕捉して新しい例外をスローするようにします。 LoginFailedExceptionをキャッチすると、より読みやすいコードになるようです。

芋両方の方法は、自分の短所を持っている(多くの例外を導入VS以下で読み取り可能なコード)と私は通常、経験豊かなJavaプログラマによってどのように扱われるか似たようなケース思ったんだけど。

例外上の任意の一般的な考えも感謝感謝みんな

+0

、あなたは、元の例外( "原因")を含むようにしたいでしょう: 'キャッチ(FunctionZFailedException E){ スロー新しいFunctionYFailedException(e)を、 } ' – JimmyB

答えて

0

あなたが方法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()."); 
    } 
} 
1

あなたのコード(およびメソッドと例外の名前)を見て見つけます。

getInputStream()メソッドがある場合、適切な例外はIOExceptionになります。 getDatabaseConnection()でそのメソッドを呼び出すと、IOExceptionを捕捉してSQLExceptionをスローする必要があります。 saveCustomerToDatabase()メソッドでこのメソッドが必要な場合は、ProcessFailedExceptionのようなものをスローする必要があります。

私はjavadocsを書くファンではありませんが、時にはあなた自身に尋ねるべきです:このメソッドとその例外のための良いjavadocを同じ言語(つまり技術的言語、ビジネス言語など)で書くことができますか? )?それはIOExceptionがスロー場合は、トラブルsaveCustomerToDatabase(のJavadocを書いを持っている)方法 - ます。多くの場合

+0

は私が与える-1 ... – JimmyB

+0

「私は書き込みのjavadocの大ファンではない」ために傾向があると私は – EasterBunnyBugSmasher

+0

が私のマウスにヘルニア文句ないでしょう、「1」になりましクリック。 - いい答えだ :) – JimmyB

関連する問題