1

在爲ASP.NET編寫代碼時,如果連接了調試器,如果您訪問引發異常的網頁,則會在導致該異常的代碼行中啓動未處理的異常幫助程序。ASP.NET如何處理未處理的異常?

即使您只捕獲未處理的異常並且沒有捕獲拋出的異常,也會發生這種情況。但是,按F5,忽略異常,或者沒有附加調試器不會導致AppDomain被拆除。不管怎樣,ASP.NET無論如何處理未處理的異常。

這是如何工作的,並且像這樣的異常處理可以在其他地方實現,以便吞併其他未處理的異常而不是終止整個AppDomain或進程?

編輯:爲了澄清,我理解異常處理和try ... catch塊如何工作。但是,在這種情況下,似乎調試器正在考慮異常未處理的,同時ASP.NET正在將try ... catch中的異常封裝起來。那是我想要模仿的行爲。

+0

我認爲這個異常是通過將最上面的異常的描述細節和stacktrace刷新到HttpResponse來處理的。我相信你也可以這樣做。 – TWickz 2012-07-28 11:31:11

+0

這裏的關鍵似乎是**用戶** - 未處理vs未處理。 – 2012-07-28 15:47:07

+0

而反對票是因爲...?如果這是一個簡單的問題,爲什麼沒有人能夠解釋調試器如何從「系統代碼」中確定「你的代碼」? – 2012-07-30 12:12:24

回答

2

這是如何工作的,

只是包裝在任何他們想要的異常處理代碼執行代碼。 asp.net網頁(或視圖,或控制器)只是一個類,如何使用它完全取決於主機(在我們的情況下,asp.net)。

爲什麼VS調試器如果處理它會中斷?

有一個引自MSDN documentation

ASP.NET有處理異常顯示錯誤頁面,瀏覽器用戶的頂級異常處理程序。除非啓用了「我的代碼」,否則該頂級異常處理程序將停止未處理的異常進入調試器。確保啓用Just My Code for ASP.NET調試。

這意味着如果你有「僅我的代碼」,在VS調試選項啓用(和它的默認啓用),你會在例外情況,在自己的代碼是未處理的,他們在是否處理irregardless突破您的來電者與否。

像這樣的異常處理可以在其他地方實現,這樣其他未處理的異常可以被吞噬而不是終止整個AppDomain或進程?

你不能這樣做,這是一種安全措施。

+0

所以你的問題是「爲什麼VS調試器認爲這是一個未處理的異常」?因爲它不是在用戶代碼中處理的。我會添加詳細的報價和鏈接到帖子。 – 2012-07-28 12:07:22

+0

這是有道理的,但在實踐中似乎並不奏效。例如,我使用MassTransit消息總線庫,當消息處理程序(我的代碼)失敗時,MassTransit(「系統」代碼)處理它,使用NLog記錄它,然後快樂地前進。用戶未處理的異常幫助程序永遠不會彈出。 – 2012-07-28 12:17:46

+0

這意味着VS調試器不會將MassTransit識別爲「不是您的代碼」。 – 2012-07-28 12:48:23

1

您的網頁只是一堆來自IIS & ASP.NET Runtime的方法調用,您的網頁並未在您的AppDomain中單獨運行。調用代碼的代碼在該方法調用周圍有一個普通的try/catch塊。

您可以創建一個類似的設置自己:通過將圍繞主營eveything一個try/catch塊,這意味着you'l趕上未在其他地方處理的任何異常

問題則是:在應用程序應該在哪裏你繼續?

最後一個問題在ASP.NET中很容易解決,因爲每個頁面調用都是相互隔離的。用戶只需再次導航到頁面即可繼續。

+0

這並沒有回答基本的問題 - 如果整個事情被包裝在try/catch塊中,爲什麼它被認爲是未處理的,而不僅僅是調試器拋出? – 2012-07-28 12:02:04

+0

因爲它沒有在用戶代碼*中處理。 VS調試器不知道它是否在IIS模塊內部深處處理。 – 2012-07-28 12:03:13

+0

@SergRogovtsev當然是的。這是異常處理的本質。向我展示其他用戶代碼不處理異常但調用者會這樣做的其他示例,但仍會彈出一個未處理的異常處理程序。 – 2012-07-28 12:05:39