WPF处理未捕获异常和程序退出事件

发布时间 2023-07-03 11:08:21作者: euv

Application和AppDomain都有Exit事件,程序正常退出,会依次调用Application的Exit事件和Appdomain的Exit事件。
如果是因为未捕获的异常导致程序退出,则不会调用任何Exit事件。
Appdomain的Exit事件不要再出现UI元素,如弹窗之类的,会导致异常。

AppDomain.UnhandledException会捕获所有Thread线程,Application.DispatcherUnhandledException只会捕获单线程模型的UI线程异常。
普通的Thread线程的未捕获线程,直接抛到AppDomain.UnhandledException处理,单线程模型的UI线程的未捕获异常,先抛到Application.DispatcherUnhandledException
处理,如果被标记成已处理(e.Handled=true),则到此为止,程序不会崩溃退出;如果未标记成已处理,下一步会接着抛到AppDomain.UnhandledException,最后程序崩溃退出。
线程池线程未处理的异常,会被线程池吃掉,既不会抛到Application.DispatcherUnhandledException和AppDomain.UnhandledException,也不会导致程序崩溃退出。如果很在意线程池线程的异常,可以封送线程池异常到UI线程,借助UI线程抛出线程池线程。