【问题标题】:try/catch performance尝试/捕捉性能
【发布时间】:2013-08-04 01:57:33
【问题描述】:

我需要阅读不同类型的 .txt 文件,为此我首先阅读标题所在的前几行。有了这些信息,我就可以选择阅读方式。问题是,如果只有一条记录采用不同的格式(比如我 substring(0,45) 并且只有 40 个字符),我的应用程序就会崩溃。我想避免这种情况,但我无法检查所有可能性。我读到你应该避免使用过多的 try/catch,而且我只在我不知道错误可能来自哪里时才使用它。

我的问题是:在循环中使用 try/catch 很糟糕(30k - 40k 次)?

如果不是,我该如何正确使用它?我不完全理解异常的目的。它们仅用于调试吗?如果不是,throw new exceptionMessageBox.Show("Error") 之间有什么区别。

如果我不通知错误而只是跳过它,我可以这样写:

try
{
//problematic code
}
catch
{
//nothing
//continue;
}

【问题讨论】:

  • 为什么要避免这种情况?该文件是坏的,不是你想忽略的东西。如果您捕获并吞下异常,那么您仅完成了编写一个忽略不良数据的程序,因此很可能也会创建不良数据。没有任何方法让用户找出问题可能出在哪里。
  • 是的,你是对的。我正在考虑使用该 sn-p 的其他情况。谢谢你的建议。 PD。如果用户选择了损坏的文件并且我抛出了 30k 异常,我该怎么办?

标签: c# exception


【解决方案1】:

在循环中使用 try/catch 很糟糕(30k - 40k 次)?

仅当您预计会有大量异常时。如果不抛出异常,则性能开销很小。

它们仅用于调试吗?

否,但主要用于在运行时查找错误(大多数情况下会记录异常,以便您查看程序崩溃的位置/原因)。您无法预料到所有可能发生的情况,因此拥有一个日志以便在它发生崩溃时进行查阅非常有帮助。

它们还允许恢复(如果您知道导致异常的原因并知道如何处理它)。这方面的一个例子是数据库事务死锁 - 当两个线程竞争相同的数据库资源时,将选择一个终止(死锁受害者) - 这只能通过异常捕获并通过重试事务来处理。


以下是非常有问题的:

catch
{
//nothing
}

为什么?因为你最终会忽略你没有预料到的异常——你把它们扔掉了,当你的程序最终崩溃或出现奇怪的错误时,你将不知道为什么。

【讨论】:

  • 我忘了提到在那次捕获中我会退出循环。当我在最后存储读取列表时,我会得到一个空文件,并且我确保不会出现问题。这不正确吗?
  • @Sturm - 我不知道。真的取决于您的应用程序所需的逻辑。
【解决方案2】:

但我无法检查所有可能性

是的,你可以!这就是通常的做法。在设计一个复杂的函数时,您希望考虑每种情况。每个没有考虑到的案例都是潜在的错误。

而且你的 try-catch 隐藏了你没有想到的错误。您希望出现异常,以便您注意到它们并解决根本问题。

严格 遵守所有 nullref 和 indexoutofbounds 异常始终是错误的约定。这最终节省了您的时间。

【讨论】:

  • 优秀工程师的标志之一是不会引入多余的案例。例如,如果您不需要可以为空的值类型,则仅使用值类型并消除不必要的复杂性,并且需要验证的场景更少。工程师经常思考和辩论正确的抽象量。了解进一步抽象是否是正确选择的最佳方法是提出两个问题:1. 它是否满足要求? 2. 进一步抽象是否会增加必须处理的案例数量?
【解决方案3】:

从性能的角度来看,当代码在 try-catch 块中运行而不是在块中运行时,性能会受到很小的影响。查看 Do try/catch blocks hurt performance when exceptions are not thrown? 了解差异的经验证据。

throw new exceptionMessageBox.Show("Error") 有什么区别?

对于初学者来说,异常是一个可以保存信息并被扩展以创建您自己的自定义异常的对象,而MessageBox.Show() 只是使用文本向用户显示。简而言之,一个是对象,另一个是向用户显示信息的机制。它们不应被视为相互竞争的选择,而应被视为互补。

最后,catch { //nothing } 是一个可怕的想法,它相当于把头埋在沙子里,以免听到坏消息。永远不要这样做!

【讨论】:

  • 微小,你的意思是实际上微不足道。根据另一个答案,他们测量的开销不到单次调用 Math.Sin 的成本的 15%(这​​不如整数乘法快,但肯定比调用 Substring 快得多,例如OP在这里使用)。在 OP 的使用中,开销可能甚至无法衡量,更不用说让用户注意到了。
  • 所以像反射一样不要把它放在人流量大的区域,但不像反射在人流量大的区域它不会破坏你的表现。 :)
猜你喜欢
  • 2010-11-23
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多