我们正在WCF中开发一个代理,它将作为运行我们的自定义客户端应用程序的一些手持设备的通信工具。我很好奇人们使用什么错误处理策略,因为我宁愿不在try / catch中包装每个代理调用。
当我开发ASP .NET时,我没有抓住大多数异常,我利用Global asax中的Application_Error,然后可以记录异常,发送电子邮件,并将用户重定向到自定义错误登录页面。我在WCF中寻找的内容与此类似,只是它允许我从中心位置向客户端传递一般错误理由。
基本上我很好奇人们如何将他们的异常处理集中在WCF应用程序中。
由于
答案 0 :(得分:22)
您可能会在此处找到IErrorHandler界面。我们一直在使用它来做你提到的几乎所有 - 集中式异常日志记录和提供广泛的故障原因,而不必乱丢代码,尝试在本地处理问题。
答案 1 :(得分: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;
}
}
使用这种方法,我可以将异常从任何内容转换为可以在客户端轻松显示的内容,同时记录IT人员要查看的真实异常。到目前为止,这种方法运行良好,并且遵循与应用程序中其他模块相同的结构。
答案 2 :(得分:2)
我们使用异常处理应用程序块并屏蔽客户端的大多数错误以避免泄露敏感信息,这article可能是一个很好的起点,就像“最佳实践”一样 - 你应该使用适合你的域。