2009-09-25 94 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);