对话框中的异常导致 MSTest 崩溃
Exception in dialog causes MSTest to crash
我正在研究我们应用程序中的某些行为,并进行了一项测试,该测试始终使测试引擎崩溃。我将测试代码简化为:
[TestMethod, Timeout(2000)]
public void ShowDialogShouldCleanupAfterException()
{
var topWindow = new Window();
topWindow.Loaded += (sender, args) =>
{
var childWindow = new Window();
childWindow.Loaded += (o, eventArgs) =>
{
throw new Exception("ChildWindowException");
};
childWindow.ShowDialog();
topWindow.Close();
};
topWindow.ShowDialog();
}
每次我 运行 这段代码都会弹出一个对话框,告诉我 vstest.executionengine.exe
已停止工作。为什么会发生这种情况,我可以做些什么来确保测试在发生这种情况时保持 运行ning 吗?
编辑
类似的行为发生在 WPF 示例应用程序中:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
var childWindow = new Window();
childWindow.Loaded += ChildWindow_Loaded;
childWindow.Owner = this;
try
{
childWindow.ShowDialog();
}
catch (Exception)
{
MessageBox.Show("Exception caught");
}
}
private void ChildWindow_Loaded(object sender, RoutedEventArgs e)
{
throw new NotImplementedException();
}
...
我知道这段代码有问题。在子对话框中捕获异常可以解决这个问题。但我只是想了解为什么它会这样。
好的,我终于在我的应用程序中找到了为什么会发生这种情况以及解决它的方法。
在不同的调度程序中发生的异常,需要在该调度程序中处理。异常在堆栈中冒泡。调用 ShowDialog 后,子对话框的堆栈开始。因此,该对话框中发生的任何异常都不会被调用代码的 try/catch 捕获。这些异常需要专门处理。
In this question about handling exceptions in wpf,我发现我可以用下面的代码处理这些异常:
childWindow.Dispatcher.UnhandledException += (o, eventArgs) =>
{
// handling code...
eventArgs.Handled = true;
};
我是这样理解的。如有错误请指正!
我正在研究我们应用程序中的某些行为,并进行了一项测试,该测试始终使测试引擎崩溃。我将测试代码简化为:
[TestMethod, Timeout(2000)]
public void ShowDialogShouldCleanupAfterException()
{
var topWindow = new Window();
topWindow.Loaded += (sender, args) =>
{
var childWindow = new Window();
childWindow.Loaded += (o, eventArgs) =>
{
throw new Exception("ChildWindowException");
};
childWindow.ShowDialog();
topWindow.Close();
};
topWindow.ShowDialog();
}
每次我 运行 这段代码都会弹出一个对话框,告诉我 vstest.executionengine.exe
已停止工作。为什么会发生这种情况,我可以做些什么来确保测试在发生这种情况时保持 运行ning 吗?
编辑
类似的行为发生在 WPF 示例应用程序中:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
var childWindow = new Window();
childWindow.Loaded += ChildWindow_Loaded;
childWindow.Owner = this;
try
{
childWindow.ShowDialog();
}
catch (Exception)
{
MessageBox.Show("Exception caught");
}
}
private void ChildWindow_Loaded(object sender, RoutedEventArgs e)
{
throw new NotImplementedException();
}
...
我知道这段代码有问题。在子对话框中捕获异常可以解决这个问题。但我只是想了解为什么它会这样。
好的,我终于在我的应用程序中找到了为什么会发生这种情况以及解决它的方法。
在不同的调度程序中发生的异常,需要在该调度程序中处理。异常在堆栈中冒泡。调用 ShowDialog 后,子对话框的堆栈开始。因此,该对话框中发生的任何异常都不会被调用代码的 try/catch 捕获。这些异常需要专门处理。
In this question about handling exceptions in wpf,我发现我可以用下面的代码处理这些异常:
childWindow.Dispatcher.UnhandledException += (o, eventArgs) =>
{
// handling code...
eventArgs.Handled = true;
};
我是这样理解的。如有错误请指正!