2012-02-23 169 views
2

我在我的ASP.net MVC項目中有一些代碼異步調度消息。在某些情況下,這些代碼可能會失敗並導致無用的異常。我沒有直接訪問拋出異常的代碼或生成線程的代碼,所以我無法捕捉並處理錯誤。我試圖捕捉Global.asax中的Application_Error級別,但該函數僅針對頁面錯誤而不是後臺錯誤。我也嘗試通過實現OnUnhandledException來捕獲HTTP模塊,但我無法找到異常並阻止工作進程在那裏存在。如何防止ASP.net WP終止錯誤

有沒有一種方法,以防止如此致命的這些錯誤?我知道他們是嚴重的錯誤,應該處理,但我寧願他們不要終止其他頁面上的其他用戶的工作進程。

更多細節:

的消息調度是EventStore,我相信我有這種情況下的問題是,它試圖反序列化,其實現的ICommand從以前版本的NServiceBus的消息。在更新到最新的測試版之後,似乎反序列化失敗了。不幸的是,我愚蠢地刪除了導致錯誤的提交,所以我不能完全重複該問題。

到目前爲止,我已經找到了模擬誤差,最好的辦法是做

public virtual ActionResult Error() 
    { 
     Task.Factory.StartNew(blowup); 
     return new EmptyResult(); 
    } 
    private void blowup() 
    { 
     throw new Exception("snap"); 
    } 

你會發現捕捉異常被拋出,妥善處理,而不會造成問題。但是,如果您等待,那麼我們沒有觀察到任務的異常屬性,最終會終止整個應用程序。

測試對卡西尼但在IIS 7.5中類似的行爲觀察。

回答

1

的問題是,任何未處理的異常使處理中止。這個問題與ASP.NET無關。

胡克的unobservedtaskexception事件(http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.unobservedtaskexception.aspx)來捕獲所有異常(並寄給您和電子郵件)。

我認爲這是最好的做法掛鉤這一事件加上Application_Error事件加上Thread.UnhandledException事件。

+0

這是一個很好的說明,但我對任務的使用只是一個快速的方式來顯示後臺線程異常沒有被捕獲。 – stimms 2012-02-23 21:56:54

+0

我的建議將處理_all_未處理的異常(如果您還收縮到UnhandledException事件)。 – usr 2012-02-23 22:01:24

+2

啊好吧,太好了。我現在可以高興地攔截並記錄異常,但它仍然會降低工作進程。我發現關鍵是將異常設置爲觀察到的http://blogs.microsoft.co.il/blogs/bondib/archive/2011/02/08/crashes-task-parallel-library-tpl-and-the-unobservedtaskexception .aspx – stimms 2012-02-23 22:50:34

1

.NET 1.1對所有未處理的異常都有一個支持。它會悄悄地抓住它們並繼續它的快樂之路。

在.NET 2.0中,Microsoft將此更改爲您現在看到的行爲:任何完全未處理的異常都會導致進程中斷,但您可以通過Application_Error方法的「Handler Soup」處理某些異步異常,Thread .UnhandledException事件,並在.NET 4.0中,TaskScheduler.UnobservedTaskException。

微軟爲了恢復.NET 1.1的行爲,它可以在一個Web應用程序,其中一個錯誤的異常可能回收的全過程,搗毀在這個過程中寶貴的緩存項真正的關鍵提供了一個配置值。

<runtime>部分:

<legacyUnhandledExceptionPolicy enabled="1"/> 

微軟的文章Exceptions in Managed Threads解釋這一切,更多的細節。

+0

這不是一個好的解決方案。簡單地忽略這些錯誤不會對任何人有所幫助。有一個原因是2.0中的功能被修改了 – stimms 2012-03-02 15:21:27

+0

當然,你仍然應該記錄,分類和修復。問題是如何防止他們終止Web應用程序。 – 2012-03-02 21:54:06