繁体   English   中英

C#类范围内的异常处理

[英]c# class-wide exception handling

是否可以在ac#类文件中的单个位置捕获异常?

我正在NUnit中编码一些单元测试以测试WCF Web服务,并且在所有方法/测试上都希望捕获“ EndpointNotFoundException”,而不必为每个测试编码。

编辑

我想我想在这种情况下创建一个描述性错误,而不必在每个方法中都放置一个额外的catch块,因为我确实确实希望测试失败。

因为我用FaultException在WCF中做了类似的事情,所以我很想知道C#类是否有可能

但最重要的是,如果失败,它将失败! 感谢@TrueWill陈述明显的;)并感谢@Abhijeet Patel让我更多地思考我如何构建单元测试

(哦,很抱歉回答我自己的问题;)

一般而言 ,否-您只能在本地捕鱼。 在某些情况下,您可以单独执行此操作-ASP.NET MVC控制器和WCF 服务是两个可以让您轻松(或足够容易)分离错误处理的示例。

但是就您而言-您是否只想向受影响的测试添加[ExpectedException(...)]

也许更好的方法是考虑使用AOP(后锐化)或策略注入来注入异常处理代码?

AFAIK,您无法执行的操作。 您可以查看Application.ThreadException和AppDomain.CurrentDomain.UnhandledException以进行集中式异常处理。

您可以使用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 ,都会对其进行“处理”。

注意:我不主张这是个好主意。 这仅仅是如何实现它的一个例子。

可以进行面向方面的编程来处理诸如EndpointNotFoundException ..之类的单一类型的异常,并且可以使用该异常将其记录在某处。

我针对此类问题采取的一种方法是提供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);

您将必须创建一个日志记录机制(或使用第三方实现,例如log4net),并在记录异常的任何地方插入catch块。 换句话说,没有。

正如Marc所指出的那样,在单元测试中使用[ExpectedException]似乎是最合乎逻辑的方法,特别是对于要重点关注功能单元的单元测试。 如果您要进行很多尝试...捕获样式处理和条件检查,那么您的单元测试并不是真正的单元测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM