簡體   English   中英

為什么單擊按鈕后重新拋出的異常不會返回給用戶?

[英]why would a re-thrown exception in a button click not get back to the user?

我有以下代碼:

001 private void uiButton1_Click(object sender, EventArgs e)
002 {
003     string someString = "";
004     try
005     {
006         someString = ThisMethodThrowsAnException();
007     }
008     catch (Exception)
009     {        
010         throw;
011     }
012 }

代碼確實到達了陷阱,但是標准的winforms“未處理的異常”對話框從不顯示。

ThisMethodThrowsAnException()引發類型為System.Exception的異常。 我有一個附加到Application.ThreadException的事件。 在這種情況下,不會觸發該事件。 uiButton是標准的winforms按鈕。 我創建了一個按鈕,在其事件處理程序拋出異常和異常被Application_ThreadException抓住。 所有處理都在一個線程上進行。

在我的一生中,我看不到為什么這段代碼不會導致普通的異常框(因為這是我唯一使用的應用程序,因此很有用)。 在此應用程序中,還有其他地方我可以看到標准異常對話框。

我有一個按鈕單擊處理程序,如下所示:

 private void button2_Click(object sender, EventArgs e)
    {
        throw new Exception("I are broke!"); 
    }

還有一個ThreadException處理程序,如下所示:

 static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
            MessageBox.Show("Exception: " + e.Exception.Message); 
        }

我正在使用UnhandledExceptionMode.Automatic。 當我單擊uiButton1時,我沒有通過Application_ThreadException收到異常消息。 但是,如果我在對ThisMethodThrowsAnException的方法調用之前添加了throw新的Exception,則會得到MessageBox。

我確實通過button2(通過Application_ThreadException)獲得了一個MessageBox。

因此,ThisMethodThrowsAnException中發生了一些事情。 我唯一能想到的是它正在啟動一個新線程,但是當我調試它時並非如此。

如果異常發生在另一個線程上,它將返回到uiButton1_Click中的catch塊嗎?

調試器正在妨礙您。 Application類知道調試器已附加到該程序,它使用System.Diagnostics.Debugger.IsAttached()。 如果是這樣的情況下, 使用try / catch塊各地的消息循環和Application.ThreadException事件將不會運行。

這是故意的。 如果catch塊處於活動狀態,則將很難排除程序中的異常。 如果沒有catch塊,調試器將始終停止並向您顯示問題所在。

您可以重現運行時行為。 在Run()調用之前,將以下代碼行添加到Main()方法中:

 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

暫無
暫無

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

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