代码之家  ›  专栏  ›  技术社区  ›  Ashish Gupta Shiva

FaultException<T>()客户端捕获未捕获服务引发的异常(FaultException<T>)

  •  3
  • Ashish Gupta Shiva  · 技术社区  · 14 年前

    public double DivideByZero(int x, int y)
    {                   
        if (y == 0) 
        { 
            throw new FaultException<ArgumentException>
              (new ArgumentException("Just some dummy exception")
              ,new FaultReason("some very bogus reason"), new FaultCode("007"));
        }
        return x / y;
    }
    

    下面是从client:-

      Console.WriteLine("Enter the x value");
      string x = Console.ReadLine();
      Console.WriteLine("Enter the Y value");
      string y = Console.ReadLine();
      try
      {
          double val = client.DivideByZero(Convert.ToInt32(x), Convert.ToInt32(y));
          Console.WriteLine("The result is " + val.ToString());
      }
      catch(FaultException<ArgumentException> exp)  
      {
          Console.WriteLine("An ArgumentException was thrown by the service "+ exp.ToString());    
      }
      catch (Exception exp)
      {
          Console.WriteLine(exp.ToString());
      }
    

    在上述情况下,catch(FaultException exp)(客户机代码中第一个带有ArgumentException的catch块)块不会执行。但是,当我删除ArgumentException以获得catch(FaultException exp)时,会执行相同的catch块。我不确定这一点,因为我抛出了我的经营合同例外。我有什么遗漏吗。

    感谢你的帮助,

    编辑:-当我更新客户机中的服务引用时,我能够捕捉到 FaultException<ArgumentException> 例外。

    2 回复  |  直到 14 年前
        1
  •  3
  •   John Saunders    14 年前

    用它试试 FaultException<DataContract> 对于某些任意数据协定类型。如果您查看代理类中生成的错误代码,我敢打赌您会看到 ArgumentException 不是按你期望的方式序列化。

        2
  •  0
  •   John Saunders    13 年前

    如果要派生异常类,请确保自定义异常具有序列化构造函数

    protected MyCustomException(
              SerializationInfo info,
              StreamingContext context)
                : base(info, context) { }