gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:59:46 24 4
gpt4 key购买 nike

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

我的自定义异常(exception)是:

[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 属性行中的某些内容? (虽然我尝试过,但无济于事)。

最佳答案

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

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

只有当你这样做时, 然后 您可以在客户端代码中捕获和处理特定的、通用类型的 FaultException。

MSDN docs on FaultException<T> blog post有关 WCF 错误处理的更多背景信息和良好信息。

此外,我个人总是用 [DataContract] 属性装饰我的错误契约(Contract)类(以及我想用 [DataMember] 序列化的所有成员):
[Serializable] 
[DataContract]
public class MyCustomException : ApplicationException
{ ... }

关于.net - 自定义异常作为故障异常中的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2141033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com