使用Window类中的ShowDialog方法显示WPF窗口对话框,就像在主窗口上按下按钮一样,如下所示.
private void button1_Click(object sender, RoutedEventArgs e)
{
try
{
var window = new Window1();
window.ShowDialog();
}
catch (ApplicationException ex)
{
MessageBox.Show("I am not shown.");
}
}
Run Code Online (Sandbox Code Playgroud)
该窗口在xaml中订阅了一个Loaded事件,如下所示:
<Window x:Class="Stackoverflow.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Loaded="Window_Loaded">
<Grid />
</Window>
Run Code Online (Sandbox Code Playgroud)
Window_Loaded事件中抛出异常
private void Window_Loaded(object sender, RoutedEventArgs e)
{
throw new ApplicationException();
}
Run Code Online (Sandbox Code Playgroud)
但是,ShowDialog调用周围没有捕获异常,调用也没有返回.吞下异常并仍然显示窗口.
为什么会发生这种情况?如何处理WPF窗口的Window_Loaded事件中的异常?我是否必须在事件处理程序中捕获它并手动处理窗口?
在WinForms中,您需要打电话 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException)
为了让异常通过ShowDialog调用冒泡.是否需要在WPF上设置类似的开关?
Visual Studio能够打破所有异常,即使它们被捕获.请注意CLR异常的"Thrown"下的复选框.检查时,throw即使catch调用堆栈中存在某个位置,调试器也会在每个语句上中断.

有没有办法在代码中执行此操作?我在64位类库中使用.NET 4.5.1.我的目标是记录每个异常及其堆栈跟踪.这样,当我在没有Visual Studio的计算机上测试我的程序时,我会得到抛出异常的日志,甚至是我通过向用户显示对话框来处理的异常.我的程序是多线程的,因此它需要在任何线程中引发抛出异常的事件.
一种可怕的方法就是扩展Exception,将一些代码放在新类的构造函数中,并确保每个异常都扩展它.但是,这是不可行的,因为抛出的许多异常甚至不是我的代码而是CLR本身.
那么,关于如何引发或监听在抛出异常时引发的事件的想法,即使捕获该异常也是如此?我所见过的是各种捕捉未捕获异常的方法,这不是我想要的.