.net 自定义异常作为故障异常中的详细信息

.net 自定义异常作为故障异常中的详细信息,.net,wcf,exception-handling,faultexception,.net,Wcf,Exception Handling,Faultexception,我试图从我的WCF服务中的FaultException中抛出我自己的自定义异常,并在我的WCF客户端中捕获它。但是,在客户端,异常被捕获为非泛型FaultException,并且自定义异常的详细信息丢失 我的自定义例外是: [Serializable] public class MyCustomException : ApplicationException { ... } 我是这样扔的: throw new FaultException<MyCustomException>(n

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

我的自定义例外是:

[Serializable] public class MyCustomException : ApplicationException 
{ ... }
我是这样扔的:

throw new FaultException<MyCustomException>(new MyCustomException("foo bar!"));
抛出新的FaultException(新的MyCustomException(“foobar!”);
(请注意,我确实在接口中的方法上放置了一个[FaultContract(typeof(MyCustomException))]

以下是我如何在我的客户身上抓住它:

...
catch (FaultException<MyCustomException> mcex)
{
    Console.WriteLine(mcex); 
}
 catch (FaultException fex) 
{
    Console.WriteLine(fex); 
}
。。。
捕获(FaultException mcex)
{
控制台写入线(mcex);
}
捕获(故障异常fex)
{
控制台写入线(fex);
}
我的目标是在上面的第一个catch子句中捕获异常,但它最终会在第二个catch子句中捕获

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


我猜问题在于MyCustomException是序列化的(而不是通过DataContractSerializer),可能我缺少了WCF的一些附加指令。ServiceKnownType属性行中有什么内容?(虽然我尝试了,但没有成功)。

是的,除非您在服务合同中将该类型指定为故障合同,否则您将无法捕获一般故障异常:

[ServiceContract]
interface IYourService
{
   [OperationContract]
   [FaultContract(typeof(MyCustomException))]
   SomeReturnValue YourMethodCall(SomeInputValue input);
}
只有这样做,然后才能捕获并处理客户端代码中特定的、一般类型的FaultException

有关WCF错误处理的更多背景信息和良好信息,请参阅本文

另外,我个人总是用[DataContract]属性(以及我想用[DataMember]序列化的所有成员)装饰我的fault contract类:


感谢您的帮助,但正如我最初提到的,我已经在ServiceContract中的抛出方法上正确设置了FaultContract属性,这并没有解决问题。此外,AFAIK不可能用[DataContract]修饰.net中的异常,因为异常总是实现ISerializable,并且这两种序列化机制冲突。至少今天每当我尝试这个方法时,我都会发现一个非常明显的错误。这里有更多信息:这里有::)是的,通常,由于SOAP错误是为与非.NET客户端的互操作性而设计的,所以您不仅可以使用标准的.NET异常作为详细信息,还可以使用自定义类,我将用[DataContract]和[DataMember]来修饰这些类
[Serializable] 
[DataContract]
public class MyCustomException : ApplicationException 
{ ... }