對於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