5

我试图从我的 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 子句中被捕获。

奇怪的是,如果我将 MyCustomException 替换为 ApplicationException,那么 FaultException 确实会被正确捕获。

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

4

1 回答 1

3

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

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

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

有关WCF 错误处理的更多背景信息和有用信息,请参阅此博客文章中的MSDN 文档。FaultException<T>

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

[Serializable] 
[DataContract]
public class MyCustomException : ApplicationException 
{ ... }
于 2010-01-26T17:10:29.683 回答