try/catch块的性能成本

Gen*_*c35 8 .net c# asp.net

可能重复:
'尝试'的性能成本

我被告知,在一个百万的for循环的例子中,添加一个try catch块会增加大约1000倍的主要性能成本.这是真的?

是不是最好尽可能使用try catch块?

Kev*_*ell 31

来自MSDN网站:

找到并设计出异常繁重的代码可以带来不错的性能.请记住,这与try/catch块无关:只有在抛出实际异常时才会产生成本.您可以根据需要使用尽可能多的try/catch块.无偿使用例外是您失去性能的地方.例如,您应该远离使用控制流异常之类的事情.

另见这些相关的SO问题:(1) (2) (3)(4).


Jon*_*eet 10

我可以发誓几天前就有这样的问题了,但我找不到......

只是添加try/catch块不太可能在不抛出异常时显着改变性能,尽管它可能会阻止方法被内联.(不同的CLR版本在内联方面有不同的规则;我不记得细节.)

真正的代价是当异常被抛出实际-甚至是费用通常是夸大了.如果您恰当地使用异常(即仅在真正异常或意外的错误情况下),那么除非您的服务太过于无法被视为"正常工作",否则它们不太可能成为重大的性能损失.

至于你是否应该尽可能多地使用try/catch块 - 绝对不行!如果你真的可以处理它,你通常应该只捕获一个例外- 这是相对罕见的.特别是,吞下异常几乎总是错误的做法.

我写了更多的try/finally块(有效 - 几乎总是通过using语句)而不是try/catch块.Try/catch有时适用于堆栈的顶层,因此即使一个请求失败,服务也可以继续处理下一个请求,否则我很少捕获异常.有时值得捕获一个异常,以便将它包装在一个不同的异常中 - 基本上是翻译异常而不是真正处理异常.

  • ..比较少见?那么如果你打开一个不存在的文件会导致应用崩溃?如果你的应用程序崩溃了404?如果您将没有数字的字符串转换为数字会使应用程序崩溃?我会说除非程序无法恢复让它崩溃.但如果你能恢复,那不应该是首选吗? (2认同)
  • @Toad:如果您要将字符串转换为数字,那么一方面,如果它是用户输入,您应该使用 TryParse。但关键是,其中大部分应该在相对较高的水平上被捕获——如果有的话。对于客户端应用程序来说,这比服务器端应用程序更难,但请注意问题标签 - OP 是从 ASP.NET 的角度进行讨论的。通常如果出现异常,正确的做法是中止请求并向用户报告错误。这真的需要多少个catch块? (2认同)