【问题标题】:Exception - why even bother throwing?例外 - 为什么还要麻烦扔?
【发布时间】:2013-09-05 19:07:49
【问题描述】:

所以,我知道这听起来有点极端,但我想说明一点:

好的。所以我的代码并不关心抛出了什么样的异常,99.9% 的时间如果抛出异常,它无论如何都会处理它。

现在,我为什么还要费心在我的代码中抛出 \ 创建新异常? 显然,我使用的所有库都已经抛出它们,而且信息量也非常丰富。

为我的方法传递了一个空对象?谁在乎,我会自动抛出一个空指针异常。

你能否提出一个很好的论点,为什么我应该创建新的异常并抛出它们?

编辑我的意思:

为什么要这么麻烦:

public myMethod() {

try { 
    doStuff1();
}
catch(Exception e) {
throw new Exception("Error in doStuff1");
}
try { 
    doStuff2();
}
catch(Exception e) {
throw new Exception("Error in doStuff2");
}

什么时候可以使用:

public myMethod() {

doStuff1();
doStuff2();

}

【问题讨论】:

  • 许多好的问题会根据专家的经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定专业知识。
  • 你的意思是声明新的异常classes,还是新的异常instances?你的问题目前还不清楚。如果你能提供具体的例子会很有用。
  • 正如@hexafraction 建议的那样,这是一个相当主观的问题,围绕它所处的上下文会有很多不同的意见。您的编程级别目前对于阅读您的问题的用户来说是不确定的,所以我们不知道您是否编写了任何实际需要适当异常处理的程序。您建议使用库的概念也可能表明您从未创建过自己的库,这导致您认为您认为异常处理毫无意义。
  • 乔希,你几乎把它钉在了头上,我有什么办法可以理解异常的必要性(不创建库):)
  • 当您使用别人编写的库时,可能不需要抛出异常(尽管您需要捕获由库方法抛出的异常)。但是如果你自己编写了一个库,其他人会使用它,你应该警告他们一个方法可能会抛出某些用户需要捕获的异常。

标签: java exception exception-handling try-catch


【解决方案1】:

您的客户需要详细的错误报告。出了什么问题,哪里出了问题。

他们不知道空指针异常是什么。即便如此,如果没有堆栈跟踪,这本身并不是特别有用。那么空指针会被传递到您的 RetrieveReportX 方法中吗?检查它是否为空并抛出 ReportXNoIdentifierException 而不是让它自动抛出空指针异常。然后你会在某个地方有一个错误处理程序,基于这些自定义异常,可以准确报告什么(人类)过程中出了什么问题,并且你的客户很高兴,因为他们可以看到“一个标识符”而不是 [stacktrace] 处的 NullPointerException尝试检索报告 X 时未提供。”

【讨论】:

    【解决方案2】:

    我为什么要创建新的异常并抛出它们?

    在某些情况下,故意抛出Exception 是常见且良好的做法。
    采取

    IllegalArgumentException

    如果您的方法只接受特定范围内的参数,例如只有正数,那么您应该检查无效参数并抛出 IllegalArgumentException。

    例如:

    public int calculateFactorial(int n) {
      if (n < 0)
        throw new IllegalArgumentException("n must be positive");
      if (n >= 60)
        throw new IllegalArgumentException("n must be < 60");
      ...
    }  
    public void findFactorial(int n)
    {
         try{
              calculateFactorial(n)       
          }catch(IllegalArgumentException ie){
             System.out.println(ie.getMessage());
           }
    }
    

    【讨论】:

      【解决方案3】:

      From Java tutorials - Advantages of Exceptions

      1. 优势 1:将错误处理代码与“常规”代码分开
      2. 优势 2:在调用堆栈中向上传播错误
      3. 优势 3:对错误类型进行分组和区分

      回答

      过于笼统的异常处理程序可以通过捕获和处理程序员未预料到的异常以及处理程序不打算处理的异常使代码更容易出错。

      如上所述,您可以创建异常组并以一般方式处理异常,也可以使用特定异常类型来区分异常并以精确方式处理异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-13
        • 1970-01-01
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多