9

使用保护子句防止异常还是捕获异常更好?有最佳实践吗?两种方法的优缺点?

例如更好的是:

try
{ 
    param=myArray[3];
}
catch (IndexOutOfRangeException e)
{
    do something...
}

或这个:

if(myArray.Length < 4)
{
    do something...
}
else
{
    param=myArray[3];
}

谢谢大家的回答:)

4

4 回答 4

19

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

在诸如索引超出范围之类的“愚蠢”异常的情况下,始终是前者。

在“外生”异常的情况下,总是后者。

两种方法的优缺点?

在愚蠢的例外情况下,只有后者的缺点。他们是:

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

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

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

于 2013-05-10T14:49:22.697 回答
18

使用保护子句 - 捕获异常会产生高昂的运行时成本,并且通常为了提高可读性,您应该只将异常用于错误条件,而不是用于正常控制流

于 2013-05-10T14:32:32.063 回答
5

保护条款。您永远不想将try/catch用于控制流。捕获异常是昂贵的,应该尽可能避免。

于 2013-05-10T14:33:17.217 回答
4

在可以防止异常的情况下,阻止它。总是。

捕获和处理异常是昂贵的,不应该用于正常的控制流。警卫既便宜又容易。

于 2013-05-10T14:32:35.730 回答