【发布时间】:2009-08-18 06:49:45
【问题描述】:
我正在使用 JDK1.6_14。这是一个通用问题。
什么时候进行错误处理,什么时候进行异常处理?
例如,当我进行除法运算时,我可以检查分母是否为零并抛出错误,或者只处理ArithmeticException。
但是什么时候选择哪种方法呢?
谢谢。
【问题讨论】:
标签: java exception-handling error-handling
我正在使用 JDK1.6_14。这是一个通用问题。
什么时候进行错误处理,什么时候进行异常处理?
例如,当我进行除法运算时,我可以检查分母是否为零并抛出错误,或者只处理ArithmeticException。
但是什么时候选择哪种方法呢?
谢谢。
【问题讨论】:
标签: java exception-handling error-handling
一般情况下,请避免引发异常,您可以通过执行时测试轻松避免该异常,并且由于代码中其他地方的错误以外的原因可能会导致问题。
如果您要除以某物并且您没有理由相信除数为 0(例如,如果它是用户输入的),请先检查输入。
但是,如果由于其他原因除数永远不应该为零(例如,它是绝对不应该为空的集合的大小),那么至少 更 合理地让它冒泡作为一个例外。在这种情况下,您不应该处理该特定异常,因为您不希望它出错。无论如何,您可能想要防御性地防范这种可能性 - 但是如果您发现这样的错误,您可能会想要抛出一些其他类型的异常来指示错误。同样,这不应该被“处理”,除非在堆栈顶部附近您可能会捕获一般异常(例如,即使单个请求失败,服务器也可以继续运行)。
一般来说,您应该只处理您无法合理预测的异常 - 例如I/O 故障,或 Web 服务不存在等。
【讨论】:
有以下几种情况:
可能出现问题,您可以采取一些措施(比如用户在 GUI 中提供了无效值)。
可能会出错,但您无能为力(例如:Internet 上的某些服务器死了)
可能会出现问题,并且现有异常没有提供足够的信息来找出发生了什么(想想IOException("Can't read file") vs. IOException("Can't read file "+file) vs. IOException("Can't read file "+file.getAbsolutePath()))。
解决方案:
使用try-catch 处理错误并采取适当的措施来解决问题。在示例中,在某处显示一条消息并在 GUI 中选择具有非法值的字段。
向上抛出异常,希望堆栈中更靠前的代码可以对其进行处理,或者作为最后的手段,将异常呈现给用户。在示例中,请用户稍后再试。
如果用户/开发人员在看到异常消息时很难弄清楚发生了什么,请丰富它。因此,当File.delete() 失败时,将其包装在一个RuntimeException 中,表示哪个 文件无法删除。
【讨论】:
这有助于理解differences-betweeen-exception-and-error 的区别。当您知道差异时,您就可以处理它们。 ;)
【讨论】:
类 Throwable 有两个直接子类:Error 和 Exception。 Error 的子类主要用于发出异常系统条件的信号。 Exception 的子类通常是可恢复的。您可以选择使用 try-catch-finally 来处理异常。
【讨论】:
RuntimeException 除外:P.
RuntimeExceptions。
错误处理是对系统生成错误的处理,它可能由任何不平衡的系统组件或其他方式引起,而异常处理是对可能由您的程序或相关软件生成的异常的处理。
您可能不知道您的分母在某些问题中会为零,这需要经过大量计算。最好将所有代码放在 try/catch 块中
【讨论】: