托管线程中的异常

公共语言运行时允许线程中的多数未经处理的异常正常继续。 在多数情况下,这意味着未经处理的异常会导致应用程序终止。 但是,公共语言运行时为用于控制程序流的某些未经处理的异常提供支持:

  • 由于 Abort 得到调用,因此 ThreadAbortException 在线程中抛出。 这仅适用于 .NET Framework 应用。

  • 由于线程执行时所在的应用域正在卸载,因此 AppDomainUnloadedException 在线程中抛出。

  • 公共语言运行时或主机进程通过引发内部异常来终止线程。

如果公共语言运行时所创建的线程中未处理这些异常中的任何一个,则异常会终止线程,但公共语言运行时不允许该异常继续下去。

如果在主线程或从非托管代码进入运行时的线程中未处理这些异常,则它们会正常继续,并导致应用程序终止。

注意

运行时有可能在任何托管代码有机会安装异常处理程序之前,引发一个未经处理的异常。 即使托管代码没有机会处理此类异常,仍允许异常正常继续。

在开发过程中暴露线程处理问题

如果允许线程不给出任何提示就失败(不终止应用程序),则可能无法检测出重大的编程问题。 对于长时间运行的服务和其他应用程序,此问题尤为严重。 当线程失败时,程序状态会逐渐损坏。 应用程序性能可能会降低,应用程序也可能无响应。

如果允许线程中未经处理的异常正常继续,直到操作系统终止程序为止,将会在开发和测试过程中暴露此类问题。 程序终止的错误报告支持调试。

主机重写

非托管主机可以使用宿主 API 中的 ICLRPolicyManager 接口来替代公共语言运行时的默认未经处理的异常。 ICLRPolicyManager::SetUnhandledExceptionPolicy 函数用于设置未经处理的异常的策略。

请参阅