.net 抓住所有的例外是好还是坏?
我在多个项目中看到过一种捕获所有异常的方法,可以捕获所有意外异常,这样应用程序就不会崩溃,我通常会看到:.net 抓住所有的例外是好还是坏?,.net,exception-handling,.net,Exception Handling,我在多个项目中看到过一种捕获所有异常的方法,可以捕获所有意外异常,这样应用程序就不会崩溃,我通常会看到: AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(myUnexpectedExhandler); Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(threadExHand
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(myUnexpectedExhandler);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(threadExHandler);
这是一种好的做法还是一种坏的做法。总体而言,我想说这完全取决于您,但对我来说,这取决于给定项目目前处于哪个阶段。在任何项目的初始开发过程中,我更喜欢未捕获的异常显示一条很好的描述性错误消息,其中包含它所使用的代码行,以便我可以修复它
然而,一旦一个站点成熟,我会使用我已经构建的自定义ErrorHandler类,将所有错误记录到数据库表中,并将每小时(或每天)的错误列表通过电子邮件发送给负责该项目的开发人员。需要精细处理的特殊错误通常会对可能中断的特定代码行进行尝试/捕获。我处理的每个项目最终都会得到这样的全局异常处理程序 在项目的顶层捕获异常是正确的。在那里,你可以做一些事情,比如记录它,向你的团队报告细节,等等。如果可能的话,例外情况肯定应该发布在某个地方——这对开发一个坚如磐石的产品有很大帮助(有关这方面的评论,请参阅Jeff Atwood的博客文章“”)
错误的做法是在调用堆栈的更深处不适当地捕获异常。您应该捕获异常的唯一时间是您确切知道如何处理它的时候。当然,你不应该,永远,永远,永远默默地接受例外情况。我个人认为,在生产中完全依赖例外情况是不好的做法。任何可能导致抛出异常的方法或操作都应该在该阶段处理(try..catch或传递给custome处理程序类等)。它不仅使应用程序更加健壮,因为您可以以适合情况的方式处理特定异常,而且还可以更容易地找出引发异常的原因。还有许多日志框架可供使用,使记录异常和处理错误更容易
我会使用“捕获所有”异常,但只是作为错误处理的最后一行。我会说,这是一个非常有争议的问题,许多程序员有不同的经验,往往有不同的意见。我的回答可能有点长,但我觉得我不能简短地回答 根据我的经验,我相信以下几点:
我希望有帮助 我经常在生产中使用此类异常处理程序,我的实践是我可以使用它们来:
- 通知用户确实发生了一些不好的事情,但我确实关心它,并将尽快解决它-最好这样做,而不是显示标准的无聊的windows崩溃对话框
- 发送一封包含异常消息、堆栈跟踪和任何其他有趣信息的电子邮件给我
- 捕获并从代码中不可避免的已知异常中恢复,并尝试以一些灾难性较小的方式继续
HTH在我看来,在应用程序级别捕获并记录异常是一种非常好的做法 但是这并不意味着你不再需要处理异常,你需要处理你所排除的个别类的异常 应用程序异常应仅用于程序不崩溃和日志记录目的,而不是用作应用程序的一个大尝试捕获
这也是我个人的看法。我认为全局异常处理程序将是一件好事。如果您的程序崩溃,那么它允许您在一个空间中尝试再吐出一位数据,这样您就有希望找到它崩溃的原因。不建议从全局异常处理程序中恢复,因为您可能不知道如何从顶层的任意异常中恢复。如果要记录未捕获的异常,请始终使用它记录stacktrace! 我讨厌收到日志如下的bug报告: “未处理的异常” 或 “未处理的异常:IndexOutOfRangeException”
谢谢,同事们。那太好了。+1对于这个
你应该捕捉异常的唯一时间是当你确切地知道如何处理它时。
但是如果在尝试记录异常时发生异常,你不应该吞下它,这样你就不会陷入循环中吗?在这种情况下,它将落入“你确切地知道如何处理它”的陷阱中类别——可能值得考虑使用某种回退记录器,但除此之外,如果异常日志记录本身失败,那么您可以做的事情就不多了。(对不起,我不得不这么做。)哈哈,这是个好主意