3
catch (Exception ex)
{
    DBGlobals.Error("OHMjson.Graph.saveLastGraphName - Error: " + ex.getMessage());
    msg = "Unable to save data";
    status = false;
}

エラーが発生した場合、このコードは false としてステータスをスローします。

代わりに、新しい例外をスローする必要があります。これは正しい方法ですか?より良い方法で例外を処理するにはどうすればよいですか。

4

2 に答える 2

4

エラーコード/ステータスを返すよりも、例外をスローすることを好みます。

エラー コードを返すということは、呼び出し元が常にそれを確認することを忘れないでください。例外をスローすると、呼び出し元のコードが何をすべきかを決定できます (通常、決定が上にあるほど、より適切に行うことができます)。

于 2010-10-16T20:30:26.853 に答える
2

まず、捕まえないでくださいException。特定のサブクラスをキャッチします。

IOException2 つ目は、これがどのように見えるかの基礎となるを、アプリ固有の例外でラップする必要がある可能性があります。たとえば、次のようにすることができます。

final class DBGlobalsException extends Exception
{
   Field somethingDBGlobalsSpecific;

   //where this is shorthand for chained constructors that look like Exception
   DBGlobalsException(String message, Throwable cause)
   {
     super(message,cause);
   }

   // elaborate your exception with whatever error state you want to propagate outwards
   void setField(Field ...) {}
}

そして、あなたはそうすることができました

catch (IOException ex) {
   DBGlobals.Error("OHMjson.Graph.saveLastGraphName - Error: " + ex.getMessage());
   msg = "Unable to save data";
   status = false;
   DBGlobalsException dbe = new DBGlobalsException(msg,ex);
   dbe.setField(status /* or whatever */);
   throw dbe;
}

参照:スローExceptionする、 新旧の例外スローする 、独自のローリング. これはほんの一部です。例外処理、連鎖などに関する優れた SO Q +A がたくさんあります。

また、 Oded の回答を読んでよく考えてみてください...例外は、外部コードが状態から回復するために必要なステータス (エラー コード、フラグなど) をカプセル化する必要があります。または、回復不能な状態である必要があります (参照RuntimeException)。

最後に、正規の効果的な Java リファレンス: Item 43: Throw Exceptions Appropriate to the Abstraction .

于 2010-10-16T20:30:44.670 に答える