自定义异常作为故障异常中的细节

时间:2010-01-26 17:01:33

标签: .net wcf exception-handling faultexception

我正在尝试将自己的自定义异常从我的WCF服务中的FaultException中抛出并在我的WCF客户端中捕获它。但是,在客户端,异常将作为非泛型FaultException捕获,并且我的自定义异常的详细信息将丢失。

我的自定义例外是:

[Serializable] public class MyCustomException : ApplicationException 
{ ... }

以下是我扔它的方式:

throw new FaultException<MyCustomException>(new MyCustomException("foo bar!"));

(请注意,我在接口中的方法上放置了[FaultContract(typeof(MyCustomException))]

以下是我试图在我的客户端抓住它的方法:

...
catch (FaultException<MyCustomException> mcex)
{
    Console.WriteLine(mcex); 
}
 catch (FaultException fex) 
{
    Console.WriteLine(fex); 
}

我的目标是在上面的第一个catch子句中捕获异常,但它最终会在第二个catch子句中被捕获。

奇怪的是,如果我用ApplicationException替换MyCustomException,那么确实正确捕获了FaultException。

我猜测问题是MyCustomException被序列化为Serializable(而不是通过DataContractSerializer),并且我可能错过了一些针对WCF的附加指令。 ServiceKnownType属性中的某些内容? (虽然我试过了,但无济于事。)

1 个答案:

答案 0 :(得分:3)

是的,在您将该类型指定为服务合同中的错误合同之前,您将无法捕获通用FaultException:

[ServiceContract]
interface IYourService
{
   [OperationContract]
   [FaultContract(typeof(MyCustomException))]
   SomeReturnValue YourMethodCall(SomeInputValue input);
}

只有在您执行此操作后,然后您才能在客户端代码中捕获并处理特定的,通常类型的FaultException。

有关WCF错误处理的更多背景信息和详细信息,请参阅MSDN docs on FaultException<T>blog post

另外,我个人总是用[DataContract]属性装饰我的错误契约类(以及我希望用[DataMember]序列化的所有成员):

[Serializable] 
[DataContract]
public class MyCustomException : ApplicationException 
{ ... }