好吧,我知道我在这里丢失了一些东西。我有以下操作合同: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>
例外。
绝对。如果你有一个自定义的异常类,并使用它来抛出和捕获,它确实有效。不知道为什么它不会工作(序列化)与ArgumentException。 – 2010-06-13 13:20:42
@Ashish:没有理由使用DataContractSerializer序列化Exception。不要将异常用作故障类型。它们不会作为SOAP Faults正确显示给客户端。这不是SOAP故障的内容。 – 2010-06-13 13:45:13
感谢您的回复。我对WCF非常陌生,现在意识到你可能会使用自定义异常类作为DataContract,而不是使用系统“Exception”(或其类)。 – 2010-06-13 13:54:24