WPF未处理异常行为技术问询:为何程序直接退出与官方文档描述不符?
你遇到的这个情况其实挺常见的,微软文档的描述没错,但它是有前提条件的——以下几个关键因素会导致你看不到那个默认的异常对话框:
调试模式 vs 发布模式的差异
当你在Visual Studio的调试模式下运行程序时,VS会优先捕获所有未处理异常并触发调试中断,这时候WPF的默认异常处理流程根本没机会执行。只有当你编译成发布版本,直接运行生成的exe文件时,才会触发WPF自带的异常提示对话框。异常发生在应用启动早期
如果异常是在App.xaml构造函数、Startup事件处理程序这类应用初始化阶段抛出的,WPF的全局异常处理机制还没完全初始化完成,这时候程序会直接崩溃退出,不会显示任何提示。默认配置被修改
如果你在代码里重写了DispatcherUnhandledException事件处理逻辑,并且把e.Handled设为true,就会覆盖WPF的默认行为;另外,如果你的App.config里添加了<runtime><legacyUnhandledExceptionPolicy enabled="1"/></runtime>配置,会启用旧的.NET异常处理策略,同样不会弹出默认对话框。异常来自非UI线程
WPF的默认异常捕获机制只针对UI线程的未处理异常。如果异常是在后台线程(比如你自己创建的Worker线程)里抛出且未被捕获,程序会直接退出,不会触发那个对话框。
简单来说,文档里的默认行为是存在的,但需要满足“发布模式运行、异常在UI线程抛出、应用已完成初始化、未修改默认异常处理配置”这些条件才会触发。你可以对照上面的点排查一下自己的项目情况。
内容的提问来源于stack exchange,提问作者Piotr Golacki

