catch (Exception ex)
{
DBGlobals.Error("OHMjson.Graph.saveLastGraphName - Error: " + ex.getMessage());
msg = "Unable to save data";
status = false;
}
如果我遇到错误,这段代码会抛出错误状态。
相反,我应该抛出新异常。这是正确的方法吗。我怎样才能以更好的方式处理异常。
catch (Exception ex)
{
DBGlobals.Error("OHMjson.Graph.saveLastGraphName - Error: " + ex.getMessage());
msg = "Unable to save data";
status = false;
}
如果我遇到错误,这段代码会抛出错误状态。
相反,我应该抛出新异常。这是正确的方法吗。我怎样才能以更好的方式处理异常。
更喜欢抛出异常而不是返回错误代码/状态。
返回错误代码意味着调用者应该始终记得检查它。抛出异常允许调用代码决定要做什么(通常决策越高,可以做出越好)。
首先,不要抓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;
}
另请参阅:投掷Exception
、 投掷新旧异常、滚动自己的异常。仅此而已,有很多关于异常处理、链接等方面的优秀 SO Q+ A。WikiBooks中概述了一些有用的最佳实践内容。
另请阅读Oded 的答案并仔细考虑......您的异常应该封装外部代码从条件中恢复所需的任何状态(错误代码、标志等......) - 或者它应该是不可恢复的条件(参见RuntimeException
)。
最后,规范的 Effective Java 参考:Item 43: Throw Exceptions Appropriate to the Abstraction。