2011-07-25 17 views
1

我目前正在使用現有的Windows Forms應用程序(VB.net),並且正在忙於重新處理異常處理機制。找出用戶代碼中發生了內部.Net異常的位置

目前,代碼中的很多方法都被try/catch塊包圍,捕獲一個通用的異常,然後調用一個實用工具方法,向用戶顯示一個消息框,通知他錯誤,然後記錄下來。

因此,在很多情況下,不會採取糾正措施,只會記錄異常。我知道這可能不是最好的方式,但這是他們在不久的將來必須要做的方式。

無論如何,我想這樣做在一個更通用的方式,所以我迷上了Application.ThreadException和AppDomain.UnhandledException。

這似乎工作得很好,除了一個不便之處。無論何時從.net運行時本身或第三方控件拋出一個錯誤,堆棧跟蹤都會從框架方法或第三方方法(顯然是!)中拋出異常的地方開始。

但是,如果我有完全相同找出其中這些異常越過邊界進入我的代碼的一種簡單的方法將是更加便利。我想要一個簡單的方法來確定(在Application.ThreadException中)在我自己的代碼中發生異常的地方。

我知道這個信息包含在Exception.StackTrace屬性,但我想一個簡單的方法來獲得這個特定的信息看到,因爲堆棧跟蹤屬性是一個巨大的字符串。

基本上我想類,方法和行號異常第一冒泡到我的代碼。

回答

0

你應該嘗試使用這種代碼:

[STAThread] static void Main() { 
    try { 
    Application.Run(new Form1()); 
    } 
    catch (Exception e) { 
    //do smth with exception 
    } 
} 

它會趕上的,只有你的代碼,當在同一時間AppDomain.UnhandledException可以更詳細引發的異常。當然,這隻適用於主線程。

+0

因此,如果我的代碼調用第三方控件並且該控件引發異常,它是否會被您建議的代碼捕獲?那麼Stacktrace的原點是什麼? – Quagmire

+0

我相信原點將在第三方控件中,但它也會包含您的代碼。 – Restuta

+0

我剛剛在一個小測試項目中嘗試了這個,它似乎沒有工作。在調試(Visual Studio)中運行時,我可以像您所建議的那樣捕獲異常,但在此之後,我的應用程序會自動關閉。如果我在發佈模式下嘗試這種方式,我只是得到一個標準的.Net消息框,用於未處理的異常,就像我將得到的,如果我根本沒有發現錯誤 – Quagmire

相關問題