1

我正在使用 WCF 学习故障异常,并且遇到了一个小问题。我想看看是否有人可以建议执行以下操作的适当方法。

在我的示例中,情况是我有一个登录服务方法。当进行无效的登录尝试时,我会抛出一个自定义错误异常。我还在该方法中有一个 try catch,以便捕获任何其他未知错误并将其作为自定义未知错误异常发送到客户端。

问题是,当我抛出 AuthenticationFault 异常时,一般异常捕获也会抓住它并强制发送 UnknownFault。

查看代码后,我可以理解为什么会发生这种情况。所以,我要问社区应该如何适当地处理这个问题?

我不应该在服务中使用一般异常捕获并始终允许客户端处理吗?我真的不想使用这种方法,因为那样我将如何处理服务器上其他可能的未知异常并可能记录它们?

是否有可能具有类似于“捕获任何异常-except-faults”的捕获状态?

谢谢,下面的代码。

try
{
    Authenticator AuthTool = new Authenticator();
    if (AuthTool.Authenticate(credentials))
    {
        //--Successful login code
    }
    else
    {
        AuthenticationFault fault = new AuthenticationFault();
        fault.Message = "Invalid Login or Password";
        throw new FaultException<AuthenticationFault>(fault, new FaultReason(fault.Message));
    }
}
catch (Exception ex)
{
    UnknownFault fault = CommonUtil.CreateCommonFault(ex);
    throw new FaultException<UnknownFault>(fault, new FaultReason(fault.ErrorMessage));
}

上面的“catch (Exception ex)”代码捕获了之前抛出的错误异常。

try
{
    //--proxy call to the service Login method
}
catch (FaultException<AuthenticationFault> af)
{
    //--Never gets here
}
catch (FaultException<UnknownFault> uf)
{
    //--This is what is handling although I threw the AuthenticationFault
}
catch (Exception ex)
{
    //--any other unknown error
}

以上是客户端错误处理

4

1 回答 1

1

您需要AuthenticationFault在第一个块中明确捕获并重新抛出您的。您的一般捕获是将其转换为FaultException<UnknownFault>.

try
{
    Authenticator AuthTool = new Authenticator();
    if (AuthTool.Authenticate(credentials))
    {
        //--Successful login code
    }
    else
    {
        AuthenticationFault fault = new AuthenticationFault();
        fault.Message = "Invalid Login or Password";
        throw new FaultException<AuthenticationFault>(fault, new FaultReason(fault.Message));
    }
}
catch (FaultException<AuthenticationFault>
{
    throw;
}
catch (Exception ex)
{
    UnknownFault fault = CommonUtil.CreateCommonFault(ex);
    throw new FaultException<UnknownFault>(fault, new FaultReason(fault.ErrorMessage));
}
于 2013-01-30T00:43:32.037 回答