2009-09-09 68 views
0

我有一個Windows窗體應用程序,它具有全局錯誤處理程序以顯示意外錯誤。Winforms應用程序中使用全局錯誤處理程序異常處理的問題

Namespace My 

    Class MyApplication 

     Delegate Sub ProcessParametersDelegate(ByVal sender As Object, ByVal args() As String) 

     Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException 

      Dim ErrorText As String = e.Exception.Message & ", " & e.Exception.StackTrace 

      Try      
       MessageBox.Show("Global Error Handler: An unhandled error occurred. It will be copied to your clipboard upon OKing this message: " & ErrorText) 
       Clipboard.SetText(ErrorText) 
      Catch ex As Exception 

      End Try 

     End Sub 

    End Class 

End Namespace 

在VS2008中,我有我的調試 - >設置爲默認值,這是對所有未處理的異常引發錯誤例外選項。

我有幾個問題:

1)對同一部署的代碼,我有時會行號顯示的堆棧跟蹤錯誤信息,有時不這樣做,即使錯誤消息包括我寫的源代碼而不是引用的二進制文件。該項目使用DEBUG配置進行編譯。當發生錯誤

2)申請奇怪最小化到托盤(我瘦是不可能的,任何人都可以診斷這個問題的w/o我更多的代碼貼出來,但我會反正提到它)

3 )當我試圖故意引發一個錯誤,例如,除以零,希望通過全局錯誤處理程序進行測試時,我從交互式調試器中收到一條對話框錯誤消息,而不是跳入我的全局錯誤處理程序(我想調試,因爲除了我發佈的內容,還有更多。)你有任何想法如何觸發並強制執行全局事件處理程序嗎?

回答

2

1)

如果你缺少你的堆棧跟蹤的一部分,這可能是因爲您是如何忽略內部的異常。

相反的:

Dim ErrorText As String = e.Exception.Message & ", " & e.Exception.StackTrace 

用途:

Dim ErrorText As String = e.Exception.ToString() 

此外,請確保您的.pdb文件被部署到相同的位置,你的.exe文件。

2)不確定。

3)

要通過MyApplication_UnhandledException在調試步驟:

調試 - >不開始調試

調試 - >附加到進程

在「附加查找的程序名稱處理「窗口並附加到它。你的斷點現在會被擊中。

我喜歡用這個給力的異常,但也有很多其他的選擇:

MessageBox.Show(Nothing.ToString()) 
+0

您的答案聽起來不錯,但沒有奏效。我遵循了指示,並且斷點從未被擊中。在這種情況下,異常處理程序使用StackTrace方法以及建議的.ToString方法顯示行號信息,但我相信這個建議可能是一個很好的建議。 – ChadD 2009-09-09 20:01:11

+0

2分鐘我的視頻按照你的指示 – ChadD 2009-09-09 20:04:55

+0

忘記發佈URL:http://screencast.com/t/ZPv00EOrCnTl – ChadD 2009-09-09 20:05:27

0

關於PT 3:

如果一個異常的唯一相關的處理程序是全局異常處理程序,然後調試器會將異常稱爲「未處理」。從本質上講,你不能像你正在嘗試的那樣通過你的全局事件處理程序。

+0

1歐塔三是領獎不夠好。 – ChadD 2009-09-09 16:43:09

+0

嗯......我在我的直接窗口中看到這個:警告:無法調試腳本代碼。功能錯誤 – ChadD 2009-09-09 20:07:37