代码之家  ›  专栏  ›  技术社区  ›  Rich

当.net程序由于未捕获的异常而退出时,在操作系统级别会发生什么?

  •  10
  • Rich  · 技术社区  · 16 年前

    当程序因未捕获的异常而崩溃时,“在Windows中”会发生什么?

    上下文:

    我计划写一个程序,将收集一些非常基本的信息,任何应用程序崩溃在我的本地电脑上。我希望我可以执行一个简单的方法来记录一些信息崩溃,以类似的方式Visual Studio产生一个对话框,让你调试一个程序时,它崩溃。

    2 回复  |  直到 16 年前
        1
  •  5
  •   Hans Passant    14 年前

    托管异常是使用常规的Windows结构化异常处理机制实现的。异常代码为0xe0434f4d。Windows寻找一个愿意处理异常的异常处理程序。如果代码在堆栈上没有活动的try块,或者没有catch块愿意捕获托管异常,那么托管代码的最后一步就是AppDomain.UnhandledException事件。

    如果在异常处理切换到非托管处理之后也没有实现,那么使用SetUnhandledExceptionFilter的异常筛选器集将获得快照。否则,Windows总会提供一个默认的处理程序。通常调用WER,Windows错误报告程序。它为用户提供了一个将异常详细信息发送到Microsoft的对话框。别指望会有什么结果。

    确保在最后关头捕获异常,为AppDomain.UnhandledException编写事件处理程序。记录e.ExcdeptionObject.ToString()的值,并使用Environment.Exit()终止程序。还要注意Windows窗体代码中的Application.ThreadException事件和WPF代码中的Dispatcher.UnhandledException事件。它们是在UI线程上处理事件时引发的异常的后止点。

        2
  •  2
  •   Simon P Stevens    16 年前

    对于本机应用程序,可以使用以下功能:

    AddVectoredExceptionHandler 尽管我不建议这样做,因为它也会截获捕获的异常。

    在我的应用程序中,我使用SetUnhandledExceptionFilter创建应用程序转储(使用函数 MiniDumpWriteDump 小心不要在那个功能上做太多。由于您的应用程序已经崩溃,因此不能保证任何进一步的逻辑仍能工作(例如,访问您自己的数据结构可能会导致进一步的崩溃)。

    Debugging Microsoft NET 2.0 Applications “约翰·罗宾斯。我从这本书中学到了很多,包括这个技巧。

    推荐文章