2016-08-13 163 views
0

我將在Winforms應用程序中捕獲所有未處理的異常。這裏是縮短的代碼:捕獲所有未處理的異常

[STAThread] 
static void Main() 
{ 
    if (!AppDomain.CurrentDomain.FriendlyName.EndsWith("vshost.exe")) 
    { 
     Application.ThreadException += new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod); 
    } 

    Application.Run(new frmLogin()); 
} 

private static void MyCommonExceptionHandlingMethod(object sender, ThreadExceptionEventArgs t) 
{ 
    Exception ex = t.Exception; 
    StackTrace trace = new StackTrace(ex, true); 

    var db = new MyDataContext(); 

    Error error = new Error(); 
    error.FormName = trace.GetFrame(0).GetMethod().ReflectedType.FullName; 
    error.LineNumber = trace.GetFrame(0).GetFileLineNumber(); 
    error.ColumnNumber = trace.GetFrame(0).GetFileColumnNumber(); 
    error.Message = ex.Message; 

    db.Errors.InsertOnSubmit(error); 
    db.SubmitChanges(); 

    if (new frmError(ex).ShowDialog() != DialogResult.Yes) 
     System.Diagnostics.Process.GetCurrentProcess().Kill(); 
} 

問題是,有時FormName,LineNumber和ColumnNumber沒有正確返回。下面是結果,我有時會:

--FormName--   --Line/Column-- --Message-- 
System.Linq.Enumerable  0 0 Sequence contains no matching element 
System.RuntimeMethodHandle 0 0 Exception has been thrown by the target of an invocation. 
System.Number    0 0 Input string was not in a correct format. 
System.Number    0 0 Input string was not in a correct format. 
System.ThrowHelper   0 0 Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 

正如你所看到的,LineNumbers和ColumnNumbers爲0窗體名稱是System.Linq.Enumerable ...

我怎樣才能解決這個問題?

+0

您的表單未命名爲「System.Linq.Enumerable」。假設你有一個非零的行號,那麼接下來你會怎麼做呢?如果您擁有System.Linq的正確PDB文件,您仍然不會有包含行號的文件。 .NET程序集的構建設置是「僅限pdb」,就像您自己的項目一樣。一定要測試你的應用程序的發佈版本。 –

回答

1

我該如何解決問題?

當給定模塊不存在.pdb時,堆棧跟蹤信息將不一定包含文件名,行或列號。

爲了獲得它們,您需要確保您有.NET .pdb可用並加載。有許多資源描述瞭如何做到這一點。例如,請參閱Cannot step into .NET framework source codeAdvanced .NET Debugging - PDBs and Symbol Stores。您可以使用自己喜歡的網頁搜索引擎來查找其他資源。

我還會注意到,您正在將類型名稱描述爲「FormName」,這是不正確的。當表單實際拋出異常時,它只是表單名稱。未處理的異常總是存在錯誤,因此通常由框架或其他庫代碼引發,而這些類型不會是表單。

我還會提到,捕獲所有異常僅用於診斷錯誤。這不應該被用作提高程序總體可靠性的嘗試(除非更好的診斷能夠讓你修復錯誤)。發生未處理的異常時,應該記錄它,然後終止進程。在發生未處理的異常之後允許進程繼續執行對您的數據來說是危險的,並且會導致對bug修復的自滿情緒。