2013-04-15 23 views
4

如何在C#中的類庫項目中編寫捕獲所有異常處理程序,這將使外部調用方在庫中發生的任何異常上只有一個自定義異常。從類庫中拋出單個自定義異常

我找到的最近的解決方案是實現一個Facade類,從中調用低級別的類,並在Facade的每次調用中寫入try..catch,如果發生任何異常,將會拋出一個自定義異常。

我搜索的解決方案,但得到它僅適用於Web應用程序(使用應用程序上下文,捕獲異常) 例如How to implement one "catch'em all" exception handler with resume?

我需要在類庫級別或在圖書館級的消費來實現它,但是如果好,可以通過寫最小的異常處理語句來完成。

+0

你的意思是有可能拋出的任何現有的庫和你想它,使它看起來好像只拋出一個(新的)特定類型的異常? – Jon

+0

@Jon我正在寫一個庫,我希望它只在外面拋出一個自定義異常。 –

+1

你有沒有考慮過使用AOP框架? –

回答

4

可能使用:

AppDomain.CurrentDomain.UnhandledException += (sender, e) => 
    { 
     var exception = e.ExceptionObject as Exception; 
     if (exception != null && exception.Source == "MyLib") 
     { 
      // Do stuff here 
     } 
    }; 

但嚴重的是,不這樣做。例外情況不應該以這種方式處理,你應該在本地捕獲它們。

+2

+1表示警告。儘管如此,只有當您想記錄異常(如果可能)並在此之後關閉時纔有意義。 –

+0

謝謝,它映射到要求,它是唯一可用的選項?我也會考慮你的警告。 –

+0

我應該在哪裏寫這個和如何?我想在課堂上自由地寫作... –

1

您可以使用AppDomain.UnhandledException但確保您完全閱讀文檔 - 有一些您無法處理的異常,它也取決於您使用的框架的版本。

+0

這不適用於整個應用程序中的錯誤,而不僅僅是類庫嗎? – PHeiberg

+0

是的 - 我錯過了範圍僅僅是圖書館的部分。但是,您可以檢查堆棧跟蹤並檢查異常來自哪裏。 –

+0

@ZdeslavVojkovic它不會只捕捉當前'AppDomain'中的問題嗎?這需要訂閱每個正在使用的「AppDomain」。 –