有没有特定的协议(protocol)来处理公共(public)方法中的异常?考虑这个例如。
public int someMethod()
{
try{
code that might throw an exception
}
catch(Exception e)
{
log the exception
}
}
假设此方法可能会抛出 ArrayIndexOutOfBoundsException。那么,在方法本身中处理此异常(如示例中所示)或抛出它并假设调用方法将处理该异常是否正确?
编辑: 进一步延伸我的问题。 考虑以下函数。
public int[] someMethod2()
{
try{
code that might throw an exception
}
catch(Exception e) {
log the exception
return new int[0];
}
}
如上面的示例代码所示,如果我返回大小为 0 的数组,则调用方法将失败并出现 AraryIndexOutOfBounds 异常。如果我返回 null,则调用方法将失败并出现 NullPointer 异常。既然我可以修改调用方式,那么哪种方式更好呢?我应该让调用方法失败吗?或者我应该直接在 someMethod2() 中调用 System.exit() 吗?
是否有教程可以解释这些决定? This没有给我答案。
最佳答案
一般来说,如果自己处理异常没有意义,就不要处理它。 ArrayIndexOutOfBoundsException
通常是编程错误的标志,如果您的应用程序包含编程错误,则崩溃是正确且负责任的做法。
一个大禁忌是返回 null 而不是抛出异常,如以下代码:
public Thing getThingById(long id) {
try {
ResultSet rs = queryDatabase("SELECT * FROM THING WHERE ID = " + id);
rs.next();
return new Thing(rs.get(1), rs.get(2), rs.get(3));
} catch (Exception e) {
return null;
}
}
现在,如果您从此方法中得到 null
,您不知道为什么。身份证无效吗?数据库服务器宕机了吗?或者是 queryDatabase
方法中的一些编程错误?
编辑:哦,您不应该记录并重新抛出,它只会填满您的日志并使它们无法读取。如果您重新抛出异常,则无论什么代码在调用链上进一步捕获该异常,都有可能将其记录下来
关于java - 方法的异常处理协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2979957/