WCF异常处理策略

xxi*_*nxx 24 error-handling wcf exception-handling

我们正在WCF中开发一个代理,它将作为运行我们的自定义客户端应用程序的一些手持设备的通信工具.我很好奇人们使用什么错误处理策略,因为我宁愿不在try/catch中包装每个代理调用.

当我开发ASP .NET时,我没有抓住大多数异常,我利用Global asax中的Application_Error,然后可以记录异常,发送电子邮件,并将用户重定向到自定义错误登录页面.我在WCF中寻找的与此类似,只是它允许我从中心位置向客户端传递一般错误原因.

基本上我很好奇人们如何在WCF应用程序中集中他们的异常处理.

谢谢

lee*_*e-m 22

您可能会发现IErrorHandler接口在这里很有用.我们一直在使用它来做你提到的几乎 - 集中式异常日志记录和提供广泛的故障原因,而不必乱丢代码与大量尝试/捕获尝试在本地处理问题.


xxi*_*nxx 15

所以这就是我所做的.我们的应用程序中有一些自定义异常,例如BusinessRuleException和ProcessException,WCF支持FaultException和FaultException<T>.

一般的做法似乎是,在发生一般错误或错误的情况下,您始终将FaultException抛出到客户端,您不希望显示发生的确切事件.在其他情况下,您可以传递FaultException<T>T是一个类,其中包含有关特定异常的信息.

我在应用程序中创建了Violations概念,这基本上意味着任何自定义异常都有一个包含相应Violation实例的属性.然后将此实例传递给客户端,使客户端能够识别何时发生可恢复的错误.

这解决了问题的一部分,但我仍然想要一个普通的捕获所有允许我将日志记录集中化.我通过使用IErrorHandle接口并将自己的自定义错误处理程序添加到WCF来找到它.这是代码:

public class ServiceHostGeneralErrorHandler : IErrorHandler
{
    public void ProvideFault(Exception ex, MessageVersion version, ref Message fault)
    {
        if (ex is FaultException)
            return;

        // a general message to the client
        var faultException = new FaultException("A General Error Occured");
        MessageFault messageFault = faultException.CreateMessageFault();
        fault = Message.CreateMessage(version, messageFault, null);
    }

    public bool HandleError(Exception ex)
    {
        // log the exception

        // mark as handled
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用这种方法,我可以将异常从它的任何内容转换为可以在客户端上轻松显示的内容,同时记录IT人员要查看的真实异常.到目前为止,这种方法运行良好,并且遵循与应用程序中的其他模块相同的结构.