簡體   English   中英

對話框中的異常導致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已經停止工作。 為什么會發生這種情況,我可以做些事情來確保測試在這種情況下能夠繼續運行嗎?

編輯

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之后開始。 因此,該對話框中發生的任何異常都不會僅僅被嘗試/捕獲調用代碼所捕獲。 這些異常需要特別處理。

在有關處理wpf中的異常的問題中 ,我發現可以使用以下代碼處理這些異常:

childWindow.Dispatcher.UnhandledException += (o, eventArgs) =>
{
   // handling code...
    eventArgs.Handled = true;
};

這就是我的理解。 如果我錯了,請糾正我!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM