【问题标题】:c# class-wide exception handlingc# 类范围的异常处理
【发布时间】:2009-09-25 04:20:59
【问题描述】:

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

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

编辑

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

因为我在 WCF 中使用 FaultException 做了类似的事情,所以我很想知道 C# 类是否可以实现这一点

但最重要的是,如果失败了,那就失败了!感谢@TrueWill 陈述了显而易见的事实;)感谢@Abhijeet Patel 让我更多地思考如何构建我的单元测试

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

【问题讨论】:

  • NUnit 测试方法中未处理的异常会自动使测试失败。这不是你想要的吗?
  • 如果没有抛出异常,您是否希望您的测试失败?或者,如果 EndpointNotFoundException is 抛出,您是否正在寻找一种简单的方法让您的测试失败?

标签: c# wcf unit-testing exception


【解决方案1】:

一般中,不 - 你只能在本地捕获。有一些孤立的例外 场合可以做到这一点 - ASP.NET MVC 控制器和 WCF 服务 是两个示例,让您想起错误处理可以轻松(或轻松足够)分开。

但在您的情况下 - 您不想将 [ExpectedException(...)] 添加到受影响的测试中吗?

【讨论】:

【解决方案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被抛出,都会被“处理”。

注意:我没有声称这是一个好主意。这只是如何实现它的一个例子。

【讨论】:

    【解决方案3】:

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

    AFAIK,您尝试做的事情是不可能的。您可以查看 Application.ThreadException 和 AppDomain.CurrentDomain.UnhandledException 以进行集中式异常处理。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            正如 Marc 已经指出的那样,在单元测试中使用 [ExpectedException] 似乎是最合乎逻辑的方式,尤其是对于您希望专注于功能单元的单元测试。如果你做了很多尝试...catch 样式处理和条件检查,那么你的单元测试并不是真正的单元测试

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-07-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多