java - 方法的异常处理协议(protocol)

标签 java exception

有没有特定的协议(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/

相关文章:

python - sys.exit 是否等同于引发 SystemExit?

c++ - c++ ("cin"语句中的 I/O 异常问题)

c++ ostringstream对象在返回主函数后导致未处理的异常

java - Thymeleaf 隐藏标签 :text ="#{var}"

java - 右键单击选择文本 JTextPane

java.lang.IllegalArgumentException : Expected MultipartHttpServletRequest: is a MultipartResolver configured?

java - 连接池策略 : Good, 坏还是丑?

java - 利用扫描仪填充对象数组列表

java.lang.IllegalArgumentException : Contents must be presorted

使用调用跟踪的 C++ 异常处理