托管线程中的异常

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

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

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

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

如果在公共语言运行时创建的线程中未处理这些异常,则异常将终止线程,但公共语言运行时不允许该异常进一步继续。

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

注释

运行时可以在任何托管代码有机会安装异常处理程序之前引发未经处理的异常。 尽管托管代码没有机会处理此类异常,但允许异常自然进行。

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

当允许线程以无提示方式失败时,在不终止应用程序的情况下,严重的编程问题可能无法检测到。 对于长时间运行的服务和其他应用程序,这是一个特别的问题。 线程失败时,程序状态逐渐损坏。 应用程序性能可能会降低,或者应用程序可能无响应。

允许线程中的未处理异常自然发展,直到操作系统终止程序,这会在开发和测试期间暴露出此类问题。 程序终止相关的错误报告有助于调试工作。

主机重写

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

另请参阅