gpt4 book ai didi

c# - 捕获多个自定义FaultException类型

转载 作者:行者123 更新时间:2023-12-02 08:41:41 25 4
gpt4 key购买 nike

在我的 WCF 服务上,我有一些自定义错误类型。一个名为 BaseFault 的抽象类型及其两个名为 TypeOneFault 和 TypeTwoFault 的实现

我像这样在服务端抛出异常

public string ThisMethodHasFault(string eType)
{
if (eType.Contains("One"))
{
TypeOneFault one = new TypeOneFault("TypeOneFault thrown");
throw new FaultException<TypeOneFault>(one, new FaultReason(new FaultReasonText("Fault reason here")));
}
else
{
TypeTwoFault two = new TypeTwoFault("TypeTwoFault thrown");
throw new FaultException<TypeTwoFault>(two, new FaultReason(new FaultReasonText("Fault reason here")));
}

return "";
}

我的Service界面是这样的

[OperationContract]
[FaultContract(typeof(TypeOneFault ))]
[FaultContract(typeof(TypeTwoFault ))]
string ThisMethodHasFault(string eType);

在客户端,我有一个测试 winform 应用程序,我可以像这样捕获它

   MyServiceClient client = new MyServiceClient();

try
{
client.ThisMethodHasFault(""); //get value from user

}
catch (FaultException<TypeOneFault> ox)
{
TypeOneFault oneEx = ox.Detail;
oneEx.{property} ...

}
catch (FaultException<TypeTwoFault> tx)
{
TypeTwoFault twoEx = tx.Detail;
twoEx.{property} ...
}

问题:

我似乎无法通过这样做来减少 catch block 的数量

    catch (FaultException<BaseFault> fex)
{
BaseFault Ex = fex.Detail;
twoEx.{property} ...
}

如果有一个这样的 block 可以捕获我在服务器上抛出的任何异常,并通过抽象获得正确的类的详细信息,那就太好了。通过执行上述操作,我收到错误。 mscorlib.dll 中发生了类型为“System.ServiceModel.FaultException”的未处理异常1`

我是否需要更改某些内容才能使其正常工作,或者我是否必须满足于多个 catch block ?

最佳答案

FaultException<T>继承自FaultException ,因此您可以改为捕获基本类型:

catch(FaultException ex) {
if(ex is FaultException<TypeOneFault>) {
var detail = ((FaultException<TypeOneFault>) ex).Detail;
// process it
} else if(ex is FaultException<TypeTwoFault>) {
var detail = ((FaultException<TypeTwoFault>) ex).Detail;
// process it
} else {
// unexpected error
throw;
}
}

与两个单独的 catch block 不同,它可以重构:

    catch(FaultException ex) {
if(!ProcessFault(ex)) {
throw;
}

bool ProcessFault(FaultException ex) {
if(ex is FaultException<TypeOneFault>) {
var detail = ((FaultException<TypeOneFault>) ex).Detail;
// process it
return true;
} else if(ex is FaultException<TypeTwoFault>) {
var detail = ((FaultException<TypeTwoFault>) ex).Detail;
// process it
return true;
} else {
// unexpected error
return false;
}
}

如果您的两个故障类别不相关,那么您就只能这么做了。但是,如果它们继承自共同的基础,那么您可以进一步重构:

bool ProcessFault(FaultException ex) {
if(ex is FaultException<TypeOneFault>) {
ProcessFault(((FaultException<TypeOneFault>) ex).Detail);
return true;
} else if(ex is FaultException<TypeTwoFault>) {
ProcessFault(((FaultException<TypeTwoFault>) ex).Detail);
return true;
} else {
// unexpected error
return false;
}
}

void ProcessFault(BaseFault detail) {
// process it
}

关于c# - 捕获多个自定义FaultException类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12914534/

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