2009-09-25 93 views
0

是否有可能在c#類文件中的單個地方捕獲異常?我編寫了NUnit中的一些單元測試以測試WCF Web服務,並且所有方法/測試都希望捕獲「EndpointNotFoundException」而不必爲每個測試編寫代碼。c#類的異常處理

編輯

我想我想,而不必把附加的catch塊中的每個方法,因爲我確實想測試失敗創建在這種情況下,描述性的錯誤。

像我那樣在WCF與此類似與的FaultException我有興趣知道,如果它一般是可能的C#類

但底線是,如果失敗,則失敗!感謝@TrueWill用於說明明顯;)和@Abhijeet帕特爾讓我更多地思考如何構建我的單元測試

(哦,並回答我的問題道歉;)

+1

NUnit測試方法中未處理的異常會自動使測試失敗。這不是你想要的嗎? – TrueWill

+0

如果不引發異常,您是否希望測試失敗?或者你是否正在尋找一種簡單的方法來使你的測試_不失敗,如果EndpointNotFoundException _is_拋出? –

回答

2

或許更好方法是研究用AOP(postsharp)或策略注入來注入異常處理代碼嗎?

AFAIK,你試圖做的是不可能的。您可以查看Application.ThreadException和AppDomain.CurrentDomain.UnhandledException以進行集中式異常處理。

0

您必須創建一個日誌記錄機制(或使用像log4net這樣的第三方實現)並在任何地方插入catch塊,在這裏記錄異常。換句話說,不。

1

面向方面的編程可以做處理單一類型的異常像EndpointNotFoundException..and異常可登錄使用的地方..

3

一般,沒有 - 你只能在本地抓到。有隔離例外當你可以做到這一點 - ASP.NET MVC控制器和WCF 服務是兩個例子,可以輕鬆地將錯誤處理(或易於足夠)分開。

但在你的情況 - 你不是隻想添加[ExpectedException(...)]受影響的測試?

+0

或替代地爲NUnit 2.5提供Assert.Throws/DoesNotThrow:http://www.nunit.org/index.php?p=exceptionAsserts&r=2.5.2 – TrueWill

0

正如Marc已經指出的那樣,在單元測試中使用[ExpectedException]似乎是特別適用於單元測試的最合乎邏輯的方法,您需要專注於單元功能。如果你正在做很多嘗試...... catch樣式處理和條件檢查,那麼你的單元測試不是真正的單元測試

2

你可以使用AOP來實現這一點。這個想法就像你所要求的那樣,把一些行爲(這種情況下的異常處理)附加到類中的所有方法上。

例如,使用PostSharp,你可以定義下面的「異常處理程序」:

[Serializable] 
class EndpointNotFoundExceptionHandlerAspect : OnExceptionAspect 
{ 
    public override void OnException(MethodExecutionEventArgs eventArgs) 
    { 
     if (eventArgs.Exception is EndpointNotFoundException) 
      eventArgs.FlowBehavior = FlowBehavior.Continue; // continue without throwing an exception 
     else 
      base.OnException(eventArgs); 
    } 
} 

然後添加EndpointNotFoundExceptionHandlerAspect到類定義。然後每當EndpointNotFoundException被拋出時,它將被「處理」。

注:我不認爲這是一個好主意。這僅僅是的一個例子,如何可以實現

0

我採取的一種處理此類問題的方法是提供一個InvokeAction方法,該方法允許您以相對統一的方式管理異常處理。這不依賴於每個具有類似的簽名然而,自然就可以提供更多的簽名來覆蓋這些行爲你的方法:

private void InvokeAction (Action<TData> action, data) 
{ 
    try 
    { 
     action(data); 
    } 
    catch (EndpointNotFoundException enfe) 
    { 
     .... unified handling here 
    } 
    catch (OtherExceptionType oet) 
    { 
    } 
} 

使用這種方法,那麼你就可以撥打電話到您的服務方法,這都將有相同的try catch塊調用。

例如InvokeAction(AddUser, userData);

例如InvokeAction(UpdateUser, userData);