在我的App.xaml.cs中,我有处理DispatcherUnhandledExceptions(UI线程)和UnhandledException(非UI线程)的事件。当我在dispatcher.Invoke中抛出异常时,dispatcherhandler捕获异常并处理它。我在记录异常后将e.Handled设置为true。现在奇怪的行为,如果我在调度程序之外抛出异常。作为一个regalr语句调用,控制被发送到调度程序异常处理程序,但是在处理该方法之后,app基本上失去控制但我可以通过查看告诉它仍在运行在vs。
的停止按钮还有一件事,如果我将e.handled设置为false,则将控制权发送到非ui线程异常处理程序。
令我困惑的是为什么应用程序在调度程序处理程序中处理异常后会锁定?
这是我的代码
private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
// log exception here
e.Handled = true;
} // control is lost after executing this block
private void App_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
Exception ex = e.ExceptionObject as Exception;
// log exception here
}
finally
{
Environment.Exit(-1);
}
}
答案 0 :(得分:1)
UnhandledException意味着您的应用程序实际上已经死亡。如果你得到那个事件,那么做任何事情都可以从场景中恢复为时已晚。通常,您只会将此事件用于记录错误以进行调试,并可能尝试清除某些非托管资源。
以下article详细说明了WPF中的异常处理。
答案 1 :(得分:0)
如果在OnStartup事件之后引发异常,应用程序似乎能够恢复操作,如果在两者之间引发异常,则捕获并处理异常但是主窗口从未显示但调试器显示应用程序正在运行。
我找到的最接近的解决方案是从主窗口的构造函数中删除复杂的逻辑,以允许onstartup事件执行并在我的MainWindow加载事件中执行大量加载。