[英]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.