Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 抓住所有的例外是好还是坏?_.net_Exception Handling - Fatal编程技术网

.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处理程序类等)。它不仅使应用程序更加健壮,因为您可以以适合情况的方式处理特定异常,而且还可以更容易地找出引发异常的原因。还有许多日志框架可供使用,使记录异常和处理错误更容易


我会使用“捕获所有”异常,但只是作为错误处理的最后一行。

我会说,这是一个非常有争议的问题,许多程序员有不同的经验,往往有不同的意见。我的回答可能有点长,但我觉得我不能简短地回答

根据我的经验,我相信以下几点:

  • 了解业务需求如果它是一个关键应用程序,是的,你说得很对,我们不应该让应用程序继续运行,而只是通过向用户显示一些适当的消息让它崩溃
  • 如果它不是一个非常关键的应用程序,并且您希望用户通过执行其他任务继续使用该应用程序,那么允许应用程序正常恢复是有意义的
  • 为了补充以上两点,我还想说,如果在您创建的任何线程中出现未处理的应用程序,您将无法恢复任何应用程序。只能恢复主GUI线程上的异常

    添加此类代码的全部目的是确保调试和错误报告变得更简单和容易。例如,假设您有一个非常大的应用程序,并且代码中的某个地方发生了意外异常。现在,如果您有像您提到的这样的处理程序,您可以集中整个事件并记录堆栈跟踪、消息等。一旦您有了整个日志,解决问题并了解其来源就是时间问题


    我希望有帮助

    我经常在生产中使用此类异常处理程序,我的实践是我可以使用它们来:

    • 通知用户确实发生了一些不好的事情,但我确实关心它,并将尽快解决它-最好这样做,而不是显示标准的无聊的windows崩溃对话框
    • 发送一封包含异常消息、堆栈跟踪和任何其他有趣信息的电子邮件给我
    • 捕获并从代码中不可避免的已知异常中恢复,并尝试以一些灾难性较小的方式继续

    HTH

    在我看来,在应用程序级别捕获并记录异常是一种非常好的做法

    但是这并不意味着你不再需要处理异常,你需要处理你所排除的个别类的异常

    应用程序异常应仅用于程序不崩溃和日志记录目的,而不是用作应用程序的一个大尝试捕获


    这也是我个人的看法。

    我认为全局异常处理程序将是一件好事。如果您的程序崩溃,那么它允许您在一个空间中尝试再吐出一位数据,这样您就有希望找到它崩溃的原因。不建议从全局异常处理程序中恢复,因为您可能不知道如何从顶层的任意异常中恢复。

    如果要记录未捕获的异常,请始终使用它记录stacktrace! 我讨厌收到日志如下的bug报告: “未处理的异常” 或 “未处理的异常:IndexOutOfRangeException”


    谢谢,同事们。那太好了。

    +1对于这个
    你应该捕捉异常的唯一时间是当你确切地知道如何处理它时。
    但是如果在尝试记录异常时发生异常,你不应该吞下它,这样你就不会陷入循环中吗?在这种情况下,它将落入“你确切地知道如何处理它”的陷阱中类别——可能值得考虑使用某种回退记录器,但除此之外,如果异常日志记录本身失败,那么您可以做的事情就不多了。(对不起,我不得不这么做。)哈哈,这是个好主意