使用保护条款或捕获异常更好吗?

Fab*_*ini 8 c# java exception

使用保护子句防止异常或捕获异常是否更好?有最好的做法吗?这两种方法的利弊是什么?

例如,这更好:

try
{ 
    param=myArray[3];
}
catch (IndexOutOfRangeException e)
{
    do something...
}
Run Code Online (Sandbox Code Playgroud)

或这个:

if(myArray.Length < 4)
{
    do something...
}
else
{
    param=myArray[3];
}
Run Code Online (Sandbox Code Playgroud)

谢谢大家的答案:)

Zim*_*oot 17

使用保护子句 - 捕获异常会导致高运行时成本,并且通常为了提高可读性,您应该仅对错误条件使用异常,而不是正常控制流


Eri*_*ert 17

使用保护子句防止异常或捕获异常是否更好?

如果索引超出范围的"骨头"异常,则始终为前者.

在"外生"例外的情况下,总是后者.

这两种方法的利弊是什么?

在骨头异常的情况下,后者只有缺点.他们是:

  • 与测试相比,例外是非常昂贵的.
  • 例外旨在模拟极为罕见的控制流情况; 如果潜在地访问索引超出范围是正常的,那么不要编写异常处理程序.
  • 即使处理异常,异常也被报告为侦听器的"第一次机会"异常.许多系统 - 例如ASP--监听第一次机会异常,记录所有这些异常,并将产生大量异常的组件视为错误,因为它们是.(我曾经在ASP的公共代码路径中引入了故意的第一次机会异常,一天后,我听到了男孩的故障.这些错误的子系统测试变得疯狂.)
  • 有一些例外,我称之为"愚蠢"的例外 - 空取消引用,索引超出范围等等 - 这是因为它们很容易避免并且表明失败显然是危险的,它们应该始终被视为致命的错误并且从未处理过(除非"处理程序"在关闭进程之前记录它们.)不要处理错误,消除错误.

最后,你应该阅读我关于这个主题的文章.

http://ericlippert.com/2008/09/10/vexing-exceptions/


Dav*_*ych 5

守卫条款。你永远不想使用try/catch来控制流程。捕获异常的成本很高,应尽可能避免。

  • 更准确地说,最好避免“正常”控制流的 try/catch。 (2认同)