【问题标题】:Errors and Exceptions错误和异常
【发布时间】:2009-08-18 06:49:45
【问题描述】:

我正在使用 JDK1.6_14。这是一个通用问题。

什么时候进行错误处理,什么时候进行异常处理?

例如,当我进行除法运算时,我可以检查分母是否为零并抛出错误,或者只处理ArithmeticException

但是什么时候选择哪种方法呢?

谢谢。

【问题讨论】:

    标签: java exception-handling error-handling


    【解决方案1】:

    一般情况下,请避免引发异常,您可以通过执行时测试轻松避免该异常,并且由于代码中其他地方的错误以外的原因可能会导致问题。

    如果您要除以某物并且您没有理由相信除数为 0(例如,如果它是用户输入的),请先检查输入。

    但是,如果由于其他原因除数永远不应该为零(例如,它是绝对不应该为空的集合的大小),那么至少 合理地让它冒泡作为一个例外。在这种情况下,您不应该处理该特定异常,因为您不希望它出错。无论如何,您可能想要防御性地防范这种可能性 - 但是如果您发现这样的错误,您可能会想要抛出一些其他类型的异常来指示错误。同样,这不应该被“处理”,除非在堆栈顶部附近您可能会捕获一般异常(例如,即使单个请求失败,服务器也可以继续运行)。

    一般来说,您应该只处理您无法合理预测的异常 - 例如I/O 故障,或 Web 服务不存在等。

    【讨论】:

    • 谢谢乔恩!是否有关于此主题的任何预定义规则或做法?
    • 很少有普遍接受的“规则”或“实践”。如果您混合来自不同来源的库,这可能会有点问题。
    • 我的个人实践:不要捕获错误或 Throwables,也不要捕获异常,除非您处理它们或为可怜的维护者提供有用的信息重新抛出它们,他们将在中间被调用晚上...
    【解决方案2】:

    有以下几种情况:

    1. 可能出现问题,您可以采取一些措施(比如用户在 GUI 中提供了无效值)。

    2. 可能会出错,但您无能为力(例如:Internet 上的某些服务器死了)

    3. 可能会出现问题,并且现有异常没有提供足够的信息来找出发生了什么(想想IOException("Can't read file") vs. IOException("Can't read file "+file) vs. IOException("Can't read file "+file.getAbsolutePath()))。

    解决方案:

    1. 使用try-catch 处理错误并采取适当的措施来解决问题。在示例中,在某处显示一条消息并在 GUI 中选择具有非法值的字段。

    2. 向上抛出异常,希望堆栈中更靠前的代码可以对其进行处理,或者作为最后的手段,将异常呈现给用户。在示例中,请用户稍后再试。

    3. 如果用户/开发人员在看到异常消息时很难弄清楚发生了什么,请丰富它。因此,当File.delete() 失败时,将其包装在一个RuntimeException 中,表示哪个 文件无法删除。

    【讨论】:

    • 解决方案1:您几乎从不处理错误,因为它通常不是可以处理的。根据异常,它可能处理也可能不处理(例如,在 IOException 上重试几次)。
    • 请仔细阅读。我说的是“错误”,而不是“错误”(如“java.lang.Error”)。
    【解决方案3】:

    这有助于理解differences-betweeen-exception-and-error 的区别。当您知道差异时,您就可以处理它们。 ;)

    【讨论】:

    • 我认为问题不是关于错误/异常,而是关于何时抛出异常或何时在错误发生的地方直接处理错误(例如“在方法中”)
    • 当你不确定它应该是什么样子时,阅读一些关于你想开始的主题的文章会有所帮助。
    【解决方案4】:

    类 Throwable 有两个直接子类:Error 和 Exception。 Error 的子类主要用于发出异常系统条件的信号。 Exception 的子类通常是可恢复的。您可以选择使用 try-catch-finally 来处理异常。

    【讨论】:

    • RuntimeException 除外:P.
    • 您可以像任何其他旧异常一样捕获RuntimeExceptions
    • 是的,但我想它不会在几乎所有情况下都可以恢复。
    • 实际上,您不能(正确地)概括 Throwable 的哪些子类型是可恢复的。它非常依赖于应用程序。在某些情况下,RuntimeExceptions 甚至某些错误是可以恢复的。在其他情况下,即使是 IOException 也可能无法恢复。
    【解决方案5】:

    错误处理是对系统生成错误的处理,它可能由任何不平衡的系统组件或其他方式引起,而异常处理是对可能由您的程序或相关软件生成的异常的处理。

    您可能不知道您的分母在某些问题中会为零,这需要经过大量计算。最好将所有代码放在 try/catch 块中

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 2021-08-15
      • 2014-04-06
      • 2015-03-28
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多