重构异常处理

时间:2010-01-15 10:54:20

标签: java netbeans exception-handling refactoring

好的,我犯了罪,我写了太多像这样的代码

try {
   // my code
} catch (Exception ex) {
   // doesn't matter
}

现在我要清理/重构这个。

我正在使用NB 6.7并且代码完成在第一次写入时工作正常,添加了所有异常类型等。一旦我完成了上面的代码,NB就不会给予更多帮助。

您是否知道如何说NB再次查看所有异常类型并提出处理它们的提议并再次执行代码?

4 个答案:

答案 0 :(得分:4)

PMD标识所有这些您有空catch块的地方(PMD实际上做得更多)。它有NetBeans集成,所以试一试。

在识别出所有空catch块的地方后,你必须自己考虑每个地方:

  • 有时只记录消息
  • 有时重组附近的代码。即如果您要抓取NullPointerException,请改为添加null支票。
  • 有时您将不得不考虑重新抛出(并声明已检查)异常。

答案 1 :(得分:3)

问题是,你的catch-all处理程序“处理”所有异常,因此Netbeans不需要再显示任何提示。

如果你的异常处理程序已经为空并且你打算重构它们,你可以暂时删除它们。

提示:自动格式化代码,搜索try并使用括号突出显示找到匹配的catch块。然后删除所有处理代码。

之后,Netbeans将再次提出各种行动来处理可能的例外情况。

PS:注意,Netbeans的默认处理(即仅记录)并不总是最佳选择。

答案 2 :(得分:1)

我可以提供eclipse方法,并希望它与netbeans有点类似:

  1. 删除try / catch语句 - > eclipse将显示编译器错误
  2. 使用eclipse的快速提示重构正确的try / catch(或throw)语句
  3. 您可以保存现有的异常处理代码,以便在重构后粘贴它。

    修改

    Tom对RuntimeException有很好的评论。所以程序最好看起来像这样:

    1. 复制现有的catch子句并粘贴到记事本/文本编辑器
    2. 删除try / catch语句 - > eclipse将显示编译器错误
    3. 使用eclipse的快速提示重构正确的try / catch(或throw)语句
    4. 将存储的catch子句粘贴到catch语句序列的末尾
    5. 这将保留您对RuntimeExceptions(和子类型!)的异常处理。

      所以来自

      try {
         Integer.parseInt("Force a RuntimeException");
         myInputStream.close();
      } catch (Exception oops) {
         // catch both IOException and NumberFormatException
      }
      

      你去

      try {
         Integer.parseInt("Force a RuntimeException");
         myInputStream.close();
      } catch (IOException oops) {
         // catch IOException
      } catch (Exception oops) {
         // catch NumberFormatException
      }
      

      (虽然在这种情况下你可以通过NumberFormatException手动替换Exception,但这只是一个例子)

答案 3 :(得分:1)

  

当您询问有关如何处理例外的提案时......

没有普遍接受的方法来处理它们。否则,你敢打赌java语言会隐含这种行为。

  • 在编译器足够智能之前,异常不是必须处理的低级约束。
  • 异常是一种高级语言结构,用于表达语义“发生异常的事情,您不希望将其与常规代码混合使用;您希望在特定代码中处理它”。

例外情况有两种形式:

  • 必须在每个可以抛出异常的方法中明确检查异常。
  • 未经检查的异常(RuntimeException或Error的子类)通常是隐式的。

在每个级别的代码(方法或块)中,代码必须在发生任何异常时选择要执行的操作(除了未经检查的异常,可以完全省略处理)。这是一个不同的责任选择,没有任何决定适用于所有情况:

  • 进程:抓住并完全处理它(调用代码通常不知道发生了什么)。目前的方法需要承担责任。记录开发人员的堆栈跟踪可能很有用。
  • STEP :抓住它,执行与本地代码相关的处理步骤,然后重新抛出它(或者重新抛出原始的异常作为原因)。
  • IGNORE :让它负责调用代码。

java语言允许您使特定语法更容易处理异常,例如特定异常的捕获遵循更一般的异常...


通常,您会考虑架构中的异常,并做出一些设计决策。一些例子(以独特方式混合):

  • 选择让一层处理在较低层中抛出的所有异常(例如:事务性服务):记录开发者,为用户定位一些全局信息......
  • 让一些例外进行一些方法调用,直到你到达处理它有意义的代码(例如,根据你的异常,你可以重试一个完整的操作,或通知用户......)< / LI>