2017-10-12 43 views
-1

我想覆蓋try/catch/finally塊或創建一個新的myTry/myCatch/myFinally塊,在內部有一個特定的「自動」行爲。 例如,要記錄一個異常,開發人員必須顯式調用Log(ex)方法。 =>try{...}catch(Ex ex){ **Log(ex)**; doSomething(); throw; }如何覆蓋或創建一個新的try/catch/finally塊.net c#

但是如果開發者忘記調用Log(ex),那麼什麼都不會發生。

我想創建一個能夠在裏面做一些事情的結構,比如模板模式。是這樣的:

MyTryWithAutomaticInternalLog { 
doSomething(); 
} 
MyCatch(Exception ex){ 
**//Internally this stores in someplace the exception** 
doSomething2(ex); 
throw; 
} 
MyFinally { 
//internally this saves how much time took the execution for example. 
doSomething3(); 
} 

還有像其他的選擇: 1)創建像 MyTryWithAutomaticInternalLog(()=>{ doSomething(); }, (ex)=>{ doSomethingOnError(); },()=>{ doSomethingInfinally(); }); 和MyTryWithAutomaticInternalLog內與模板圖案戰略的包裝方法,管理流程,但再次重申,開發人員必須記得用方法MyTryWithAutomaticInternalLog而不是非常標準的try/catch/finally。

2)避免在代碼中使用try/catch,並用依賴注入模式管理異常。但我想避免它。

還有其他的選擇嗎?我怎麼能覆蓋try/catch/finally塊?如果不是的話,如果您提供了一些技術信息和鏈接,我會很感激,因爲我搜索沒有太多運氣。

TKX

+0

你想要自動日誌if並且只有當調用者忘記自己做了嗎?只需添加日誌記錄和調用方的方法來抑制它。日誌記錄系統標誌,類屬性或函數的可選參數。編輯:如果這是一個實際問題,也應該使用日誌記錄系統。 Log4net或其他。這些問題已經解決了很多 – zzxyz

回答

0

一般來說,cross cutting concerns(驗證,日誌記錄,授權,審計等)應被分解出來的應用程序的「正常」的一部分,而不是試圖「超越嘗試捕捉」。

有一個很好的關於Aspect-Oriented Programming : Aspect-Oriented Programming with the RealProxy Class的MSDN文章。

同樣,您可以使用Interception具有相同的目標。在MSDN上有一篇關於interception with Unity的文章,但該功能在其他一些流行的DI容器上也可用。

某些應用程序框架還具有內置的擴展以解決交叉問題。例如,ASP.NET MVC具有filters,可以全局註冊,然後使用.NET屬性打開或關閉應用程序的特定部分。

0

我會用攔截器包裝一個服務來實現服務調用的日誌記錄。它將提供一種獲取異常的方法,而不管程序員如何編寫catch代碼。

示例是在我的服務層,我使用logginginterceptor綁定解析。

這個URL會給你一個充滿不確定性的方向推動,但會讓你抽象如何處理異常。

https://msdn.microsoft.com/en-us/library/dn178466(v=pandp.30).aspx

此外,可以從另一個代碼層通過驗證拋出該異常的對象。如果你(Throw New CustomException(「Error 121」)),你的try catch代碼就會知道該怎麼做,如果你使用了攔截,你可以處理所有類型的自定義異常(從System.Exception派生)

相關問題