2010-06-13 89 views
3

好吧,我知道我在这里丢失了一些东西。我有以下操作合同:FaultException <T>()服务抛出的异常没有被客户端catch捕获(FaultException <T>)

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

在上述情况下捕获(FaultException异常EXP)(第一catch块与ArgumentException的)块不会被执行。但是,当我删除ArgumentException以获得catch(FaultException exp)时,将执行相同的catch块。我不确定这一点,因为我从我的操作合同中抛出了FaultException。我在这里错过了什么。

感谢您的帮助, 阿希什

编辑: - 当我更新我的客户服务参考,我能赶上FaultException<ArgumentException>例外。

回答

3

对于某些任意数据合约类型,请尝试使用FaultException<DataContract>。如果您查看代理类中错误的生成代码,我敢打赌,您会看到ArgumentException未按照您期望的方式序列化。

+0

绝对。如果你有一个自定义的异常类,并使用它来抛出和捕获,它确实有效。不知道为什么它不会工作(序列化)与ArgumentException。 – 2010-06-13 13:20:42

+1

@Ashish:没有理由使用DataContractSerializer序列化Exception。不要将异常用作故障类型。它们不会作为SOAP Faults正确显示给客户端。这不是SOAP故障的内容。 – 2010-06-13 13:45:13

+0

感谢您的回复。我对WCF非常陌生,现在意识到你可能会使用自定义异常类作为DataContract,而不是使用系统“Exception”(或其类)。 – 2010-06-13 13:54:24

0

如果你是派生异常类,请确保您的自定义异常有系列化构造

protected MyCustomException(
      SerializationInfo info, 
      StreamingContext context) 
      : base(info, context) { } 
相关问题