在C#中使用异常抛出,会对性能产生影响吗?

5
基本上,问题是: C#中的异常是否会严重影响性能?避免异常重新抛出是否更好?如果我的代码中生成异常,这是否会影响性能?
对于问题本身的愚蠢,我感到抱歉。
8个回答

10

如果您担心异常的性能问题,那么您可能没有正确使用它们。

但是,确实,异常会影响性能。


我不担心。我认为你应该重新考虑你所说的话。 - 0100110010101
1
@opetrov:他说得对。当出现问题时,应该抛出异常,而不是控制程序的流程。对于任何性能密集型操作,您应该检查输入,并确保根本不会抛出异常。异常应该是例外情况。 - Will Eddins
@opetrov,@Guard非常好地总结了我想表达的观点。 - JaredPar

4

在C#中,抛出异常是一项昂贵的操作(与C#中的其他操作相比),但不足以使我避免这样做。

我同意Jared的观点,如果由于抛出异常导致应用程序明显变慢,那么我会检查整体策略。可能可以重构某些内容,使异常处理更加高效,而不是摒弃在代码中引发异常的概念。


3

在try/catch语句中运行代码不会影响性能。唯一的性能损失是当抛出异常时...因为此时运行时必须解开堆栈并收集其他信息,以便填充异常对象。


3

Microsoft开发类库的设计指南是非常有价值的资源。以下是相关文章:

异常和性能

我还建议阅读 Microsoft Press 出版的 Framework Design Guidelines 书籍。它包含了来自设计指南链接中的大量信息,并由微软公司和 Anders Hejlsberg本人进行注释。它提供了关于事物背后的“为什么”和“如何”的许多见解。


2
除了其他人说的,还有: 不要将异常用作编程流程的一部分。换句话说,不要为像 account.withdrawalAmount > account.balance 这样的事情抛出异常。那是一个业务案例。
另一个需要注意性能的重要问题是吞噬异常。这是一个很棘手的问题,一旦你开始允许你的应用程序吞噬异常,你就会在任何地方都这么做。现在你可能允许你的应用程序抛出你不知道的异常,因为你在吞噬它们,你的性能受到影响,而你不知道原因。

在我看来,对于您的琐碎情况而言,一个好的异常情况是 account.withDrawalAmount > machine.CashOnHand。 - Chris Marisic
1
@Chris,不,这仍然不是一个异常情况...实际上这是一种预期情况。有很大的可能性,即使没有技术故障,机器也可能用完钱。因此,这是一个商业案例。 - Joel Martinez
我同意Joel的观点。意外情况可能是连接丢失或类似的问题。但ATM的本质之一是它持有有限的资金,可能会用完。 - jlembke
在我看来,我仍然会将其处理为异常情况,因为这主要是不太可能发生的,我宁愿处理它,而不是让“OutOfMoneyException”关闭机器/完全锁定对机器的访问等,而不是将其作为正常分支逻辑流程的一部分。除此之外,我通常会有某种类型的全局异常策略正在发生,异常会触发某种类型的警报,表明机器需要维护等。 - Chris Marisic
我认为,每当发生某些事件时,这些事件无法通过用户的操作来解决,并且需要管理员或超级级别的访问权限才能修复,这应该是一个例外而不是业务案例。机器锁定和帐户锁定在发生的极端情况下非常不同,我不希望两者的逻辑直接平行。 - Chris Marisic

0

这并不傻,我在其他地方也看到过,比如在SO上。

异常通常发生在真正异常的情况下。大多数情况下,当没有太多恢复机会时,您会重新抛出异常(可能是在记录日志后)。因此,在程序正常执行的过程中,它不应该影响您。


0

异常(Exceptions)顾名思义是意外情况。因此,您不能指望它们成为优化的重点。往往情况下,它们的性能表现不佳,因为它们有其他优先事项,例如收集有关出错原因的详细信息。


0

.NET 中的异常确实会影响性能。这就是为什么它们应该只在特殊情况下使用的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接