对于WCF的具体情况,您可以考虑添加自己的ErrorHandler。这允许您在每次任何方法抛出异常时“注入”自己的代码以执行。
你可以将它设置这样的:
serviceHost.Description.Behaviors.Add(new ErrorHandlerBehavior()); //Add your own ErrorHandlerBehaviour
public class ErrorHandlerBehavior : IErrorHandler, IServiceBehavior
{
private static readonly Logger log = LogManager.GetCurrentClassLogger();
public bool HandleError(Exception error)
{
if (error is CommunicationException)
{
log.Info("Wcf has encountered communication exception.");
}
else
{
// Log
}
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
//Here you can convert any exception to FaultException like this:
if (error is FaultException)
return;
var faultExc = new FaultException(error.Message);
var faultMessage = faultExc.CreateMessageFault();
fault = Message.CreateMessage(version, faultMessage, faultExc.Action);
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcherBase channelDispatcher in serviceHostBase.ChannelDispatchers)
{
var channelDisp = channelDispatcher as ChannelDispatcher;
if (channelDisp != null)
channelDisp.ErrorHandlers.Add(this);
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
这也可以让你抛出各种异常和将它们转换为故障异常,这是正确的WCF处理以后,无需修改业务层或者应用try/catch代码并在那里转换它们。
请注意“throw ex;”失去原来的调用堆栈,而“抛出”才不是。 – Polyfun 2013-03-04 14:04:46
尝试的身体是否也一样? – christopher 2013-03-04 14:06:11
你几乎看着Aspect Orientated Programming这里 - http://msdn.microsoft.com/en-us/library/aa288717%28v=vs.71%29.aspx。很多像PostSharp这样的第三方解决方案都有异常处理方面的问题。另一个(更糟糕的)解决方案是捕获应用程序级别的所有异常(例如AppDomain_UnhandledException),而不是使用本地try catch块。我说更糟,因为它有效地将你绑定到没有本地的异常处理,或者用try/catch抛出你的代码(抛出) – dash 2013-03-04 14:07:08