2010-01-15 69 views
5

好吧,我犯了罪,我写了太多这样的代码重构异常处理

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

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

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

你知道一种说NB的方法吗再次检查所有异常类型 ,并提出处理它们的建议 并再次执行代码?

回答

1

当你问如何处理异常的建议...

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

  • 异常不是一个低级约束,必须处理,直到编译器足够智能。
  • 例外是一种高级语言结构,用于表达语义“某种特殊情况发生,您不想与常规代码混合使用您的处理方式;您更喜欢使用特定代码进行处理”。

异常有两种存在形式,由设计:

  • 检查异常必须在每个可以把他们的方法进行明确。
  • 未检查的异常(RuntimeException或Error的子类)通常是隐式的。

在代码(方法或代码块)的每个级别,代码必须选择在发生任何异常(除未经检查的异常,可以完全忽略该处理)的情况下应该做什么。这是一个变化的责任的一种选择,没有决定适用于所有情况:

  • 过程:抓住它,并完全处理(调用代码通常不知道发生了什么事情)。目前的方法需要有责任。记录开发者的堆栈跟踪可能会很有用。
  • 步骤:赶上它,做一个与本地代码相关的处理步骤,并重新抛出它(或重新抛出另一个异常与原始的原因)。
  • IGNORE:让它承担调用代码的责任。

Java语言让你有特定语法使得更容易处理的例外,如特定异常的捕获,随后更普遍的...


通常情况下,你在你的架构考虑异常,做出一些设计决定。一些例子(以独特的方式混合):

  • 选择有一层过程中低层抛出的所有异常(例如:交易服务)的日志记录developper,positionning一些全球信息为用户...
  • 让一些异常继续进行几个方法调用,直到您到达代码处理有意义的代码为止(例如,根据您的例外情况,您可以重试完整操作或通知用户...)
3

问题是,你的抓包处理程序“处理”所有的异常,所以不需要Netbeans显示任何更多的提示。

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

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

之后,Netbeans将再次提出各种操作来处理可能出现的异常。注意:Netbeans的默认处理(即只是日志记录)并不总是最好的选择。

+0

请注意,这将不适用于任何'RuntimeException's。 – 2010-01-15 11:11:09

1

我只是提供了Eclipse的做法,并希望它有点similiar与NetBeans:

  1. 移除try/catch语句 - >日食将显示编译器错误
  2. 使用Eclipse的快速提示重构正确尝试/捕捉(或抛出)语句

您可以保存现有的异常处理代码,将其粘贴到重构后。

编辑

汤姆关于RuntimeException的一个很好的注释。所以程序应该更好的是这样的:

  1. 复制现有的catch子句,并粘贴到记事本/文本编辑器
  2. 移除try/catch语句 - >日食将显示编译器错误
  3. 使用Eclipse的快速尖重构正确的try/catch(或抛出)语句
  4. 粘贴存储的catch子句在catch语句的顺序结束

这将保留运行您的异常处理例外(和子类型!)。

所以从

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的,但它只是一个例子)

+1

请注意,这对于任何'RuntimeException'都不起作用。 – 2010-01-15 11:14:50

4

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

确定所有与空catch块的地方之后,你就必须要考虑每一个本身:

  • 有时只是记录消息
  • 有时附近的重组代码。即如果您正在捕获NullPointerException,请添加null检查。
  • 有时您将不得不考虑重新抛出(并声明checked)异常。