异常处理

时间:2010-10-16 20:25:33

标签: java exception-handling chaining

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

如果遇到错误,这段代码会将状态设置为false。

相反,我应该抛出新的异常。 这是正确的方法吗? 我怎样才能以更好的方式处理异常。

2 个答案:

答案 0 :(得分:4)

首选抛出异常以返回错误代码/状态。

返回错误代码意味着调用者应始终记得检查它。抛出异常允许调用代码决定做什么(通常决策越高,就越好)。

答案 1 :(得分:2)

首先,不要抓住Exception。抓住一个特定的子类。

第二,是的,它可能是一个潜在的IOException,它看起来像这样,应该包含在特定于应用程序的异常中。例如,你可以:

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;
}

另请参阅:Throwing ExceptionThrowing new and old exceptionsRolling your own。这只是一些,在异常处理,链接等方面有很多很棒的SO Q + A.在WikiBooks概述了一些有用的最佳实践内容。

另请阅读Oded's answer并仔细考虑......您的异常应该封装外部代码从条件中恢复所需的任何状态(错误代码,标志等) - 或者它应该是不可恢复的条件(见RuntimeException)。

最后,规范的有效Java参考:Item 43: Throw Exceptions Appropriate to the Abstraction