3

好的,我知道我在这里遗漏了一些东西。我有以下运营合同:

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;
}

以下内容来自客户:-

  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。我在这里有什么遗漏吗。

感谢你的帮助,Ashish

编辑:-当我更新客户端中的服务参考时,我能够捕捉到FaultException<ArgumentException>异常。

4

2 回答 2

3

尝试使用FaultException<DataContract>一些任意数据合约类型。如果您查看为代理类中的故障生成的代码,我敢打赌您会发现它ArgumentException并没有按照您期望的方式进行序列化。

于 2010-06-13T13:18:32.387 回答
0

如果您正在派生 Exception 类,请确保您的自定义异常具有序列化构造函数

protected MyCustomException(
          SerializationInfo info,
          StreamingContext context)
            : base(info, context) { }
于 2011-08-09T00:34:34.613 回答