WCF异常抛出和处理OOP方式

时间:2011-06-15 10:59:39

标签: wcf oop exception-handling

好的,所以我在同一个主题here上提出了另一个问题,虽然我没有得到直接答案,但我把一些代码放在一起,我正在努力做我想做的事情。问题是,这种方式是否打破了一些OOP原则?

我想要什么

  1. 使用适当的OOP在服务上声明故障类型
  2. 在客户端有一个catch块,可以处理从服务中抛出的多种类型的异常
  3. 每个具有自己实现的错误类都有一个HandleException方法
  4. 在客户端只有一个异常块,了解抛出了什么异常并从相应的错误类中调用相应的HandleException方法
  5. 我如何运作

    在服务器上为从基本异常类型

    继承的每个异常类型声明了一个错误契约
    [DataContract]
    public class BusinessRuleViolationFault : BaseFault
    {
      public BusinessRuleViolationFault(string message)
      : base(message)
            {
    
            }
    }
    
    [DataContract]
    public class SomeOtherViolationFault : BaseFault
    {
        public SomeOtherViolationFault(string message)
            : base(message)
        {
    
        }
    }
    
      

    [DataContract]

         

    公共抽象类BaseFault

         

    {

    public BaseFault(string message)
    {
      Message = message;
    } 
    
         

    }

    在客户端,我创建了与上面相同的错误类型的部分类,并在其中实现了句柄异常方法。我必须在客户端执行此操作,因为如果我在服务端创建此方法,它将不会被序列化并通过代理可用。

    public partial class BusinessRuleViolationFault : BaseFault
    {
    
        public override void HandleException()
        {
            MessageBox.Show("BusinessRuleViolationFault handled");
        }
    }
    
    
    
    public partial class SomeOtherViolationFault : BaseFault
    {
    
        public override void    HandleException()
        {
            MessageBox.Show("SomeOtherViolationFault handled");
        }
    }
    
    
    public abstract partial class BaseFault
    {
        public abstract void HandleException();
    }
    

    然后根据基督徒代码在faultexception类上创建了一个扩展方法,我在之前的帖子中将其标记为已接受的答案。这基本上使用了反射来获取抛出的错误异常类的名称。

    然后在我的客户端catch块中,我使用该名称来创建本地创建的具有句柄异常方法的部分类的实例。

    我很想知道的是,我在这里打破了一些OOP原则吗? 这是OOP吗?

    我不希望在这个catch块中有多个if else语句或者有多个catch块。您对使用一个catch块来获得性能并通过试图找出要调用的类方法来反射而失去它的权衡有什么看法?

    感谢您的时间和耐心......

1 个答案:

答案 0 :(得分:0)

我不明白为什么需要在这里进行反思(如之前发布的问题所述)。我只是在我的代码中执行此操作并且工作正常:

try
{
    proxy.CallServiceMethod(message);
}
catch (Exception e)
{
    if (e is FaultException<BaseFault>)
    {
        BaseFault exceptionToHandle = 
            (e as FaultException<BaseFault>).Detail as BaseFault;
        exceptionToHandle.HandleException();
    }

}

除了不必要的反思之外,我没有看到你实现它的方式有任何问题(至少从OOP的角度来看)。