2014-01-09 50 views
0

我是一名學生,當我們談論編程時,很多東西都是新的,目前我正在處理DLL文件和自定義異常,用於學習目的。C#.NET - 異常不會在預期的地方顯示

(第一個錯誤)

enter image description here

所以在測試時我故意使用錯誤的代碼創建的例外。當我在測試網站中得到異常時,我可以看到dll的源代碼,而不是在page.cs中顯示它,代碼被調用。

(二錯誤)

enter image description here

在這裏,我特意創建了一個溢出錯誤,然後將其顯示在網頁上的錯誤(異常),而不是微軟的源代碼。爲什麼我的dll文件和Microsoft dll有區別?

+1

我可能會變老,但這些圖片很難看。 –

+0

現在應該好多了 – Rick

回答

2

推測,您的DLL所在的目錄也有一個類似的文件,擴展名爲.PDB。該文件包含一個數據庫,該數據庫將編譯後的代碼與用於創建該代碼的實際源代碼鏈接起來。視覺工作室只是有點使它在幕後工作

使用微軟的代碼,你只有那些.DLL文件,而不是.PDB調試符號,更不用說用於創建.DLL的實際源代碼了。由於這個原因,調試器只能從運行時向你提供堆棧跟蹤和異常,而不是導致異常的實際代碼。

注:微軟確實使可的框架代碼,它可以是configured here那些調試符號。另外,請查看Microsoft Reference Source Code Center

2

.Net只能顯示行號&用調試符號構建的DLL中函數的源代碼。

這兩個DLL都是用符號構建的,所以它顯示了源代碼。

您沒有mscorlib.dll的符號,因此ASP.Net顯示您具有符號的最接近的函數。

順便提一句,您可以下載.Net框架here的源代碼。
這還不是很實用。

2

如果您想在主頁上看到您的錯誤,請在處理它們之後拋出異常。

您的主網頁需要一個try/catch塊:

try { 
    // dll routine 
} catch (Exception err) { 
    Console.WriteLine(err.Message); 
} 

而且你的DLL的代碼的try/catch例程將是這樣的:

try { 
    // code 
} catch (Exception err) { 
    LogError(err); // if you wrote an error logging routine 
    // throw err; (basic) 
    // or, better 
    throw new Exception("My DLL had an error in Method A.", err); 
} 

這將差錯回你的主頁,告訴你發生錯誤的地方。另外,如果你想用這種方法做一些事情,它會給你最初的錯誤異常作爲一個InnerException。

+0

我認爲問題是爲什麼源代碼對於自己的DLL而不是微軟的可見。這與異常處理無關。 –