2013-03-28 26 views
0

我有這樣的代碼:C#:異常處理 - 查找錯誤

private void btnNext_Click(object sender, RoutedEventArgs e){ 
    try 
     { 
     // Lots of codes in here 
     } 

    catch (Exception ex) 
     { 
     System.Windows.MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace.ToString()) 
     } 
    finally 
     {} 
} 

它捕獲異常,但沒有告訴我哪裏有異常的代碼裏面出現。我唯一得到的是這個。

Object reference not set to an instance of an object 
    at ProjectPath.btnNext_Click(Object sender, RoutedEventArgs e) 

發佈代碼在很多機器上都能正常工作,但是在很少的機器上,它會拋出這個異常。我只是不知道在這些機器上運行時發生異常的代碼的位置。有沒有辦法找到發生異常的確切行? ex.StackTrace沒有完成工作。

任何幫助將不勝感激。

+1

不要捕獲它並在調試器中運行它。它將停止拋出異常的位置。 (或者更好,告訴你的調試器停止捕獲和未捕獲的異常) –

+2

你可以在調試器下運行它嗎?如果可以的話,只需打開讓調試器中斷引發異常的選項即可。 (菜單:調試|例外 - >打開「引發」爲'公共語言運行時例外') –

+0

以較小的原子塊重構代碼 – Dhawalk

回答

2

你應該最好在你認爲會拋出異常的地方放置單獨的try-catch塊 - 而不是把所有的東西放在同一個地方。

否則,當您調試時,它會創建pdb文件 - 如果它們存在於執行文件的文件夾中,則可以獲取行號。

這就是說,這個錯誤是很常見的,你有一個null的地方。

添加:在這裏,我假設由於某種原因,您無法讓調試器停止異常,和/或無法追蹤它,因爲您將它部署到第三方或其他東西。

+0

是的,不能使用調試器,因爲它是一個已部署的解決方案。 – Butters

+0

使用單獨的try catch塊並找出它的位置。 – Butters

1

要找到確切的位置 - 源代碼中的特定行 - 它有助於在調試器中運行代碼並在異常處理程序中設置斷點。

如果您檢查作爲異常處理程序參數引用的數據結構(示例中爲ex),則會找到名爲StackTrace的數據成員。如果位置在任何地方,它將在這裏。在這裏,例如,我正在處理異常的字符串的方式如下:

at DOffice.BrMan.getLastReportRefreshed() in E:\\src\\BrMan.cs:line 5370 
at DOffice.BrParms.lookupParmByParmName(String parmName) in E:\\src\\BrParms.cs:line 169 
at DOffice.BrMan.populateAllFromTextFile(String workDirectory) in E:\\src\\BrMan.cs:line 3218 
at DOffice.BrMan.setWorkPath(String pathOfCurrentDoc) in E:\\src\\BrMan.cs:line 1686 
at DOffice.Form_Dash.InitWork(Object sender) in E:\\src\\Form_Dash.cs:line 1261