是否有可能捕获基础错误&检索原始异常? C#

时间:2014-03-20 11:05:53

标签: c# .net wcf exception exception-handling

我确实认识到这不是正常的做事方式,所以在提出完整问题之前我会先解释一下。

我们正在连接一个外部的restful服务,它有8种我们使用的方法。它返回BaseResponse并带有:

  • ResponseCode
  • ResponseDesc
  • Message

如果响应代码为-1,则操作成功,否则代码可能是大约+ -40错误中的任何一个。为了减轻每个处理器中有一个大量的switch语句,我创建了一个ResponseCodeHandler,它存在于外部服务的项目中。

此处理程序解释代码并按如下方式抛出相关的错误消息:

throw new FaultException<OfflineFault>(new OfflineFault(), errorMessage);

现在看起来*几乎每个方法都会出现错误,我希望避免每个处理器中有40个捕获 - 几乎每个错误都需要以不同的方式处理,我不妨在任何地方切换。我也不能只重新抛出错误,因为如果抛出错误就需要设置某些项目。

我想知道以下内容是否可行(我需要在catch中找到OfflineFault):

try
{
    throw new FaultException<OfflineFault>(new OfflineFault(), "description");
}
catch (FaultException e)
{
    audit.SetStatus(AuditTransactionStatus.Error, e.Message);
    throw faultsource.Build<OfflineFault>();
}

faultource只是确保错误记录在任何地方等。

我意识到我可以通过审计和故障源,但我不愿意,因为它在当前设置中会有点hacky。

*仍在等待外部公司的反馈

编辑:按要求捕获所有内容的示例。我为所有代码创建了一个枚举,以提高可读性。

                // all errors which must throw a offline fault
            case ResponseCodes.HostUnavailable:
            case ResponseCodes.HostTimeout:
                throw faultSource.Build<OfflineFault>(operationName, errorMessage);

                // Already registered faults
            case ResponseCodes.UsernameAlreadyRegistered:
                throw faultSource.Build<UsernameAlreadyRegisteredFault>(operationName, errorMessage);

            case ResponseCodes.CellNumberAlreadyRegistered:
                throw faultSource.Build<CellNumberAlreadyRegisteredFault>(operationName, errorMessage, ServiceFaultCode.CellNumber);

            case ResponseCodes.EmailAlreadyRegistered:
                throw faultSource.Build<EmailAlreadyRegisteredFault>(operationName, errorMessage, ServiceFaultCode.Email);

1 个答案:

答案 0 :(得分:0)

从我能找到的一切都不可能。

如果捕获基本异常,则无法检索原始异常类型。

即。如果您遇到例外,您将无法发现它是以 OfflineFault 引发的。