WCF固有の場合、独自のErrorHandlerを追加することができます。これにより、メソッドが例外をスローするたびに実行される独自のコードを「挿入」することができます。
あなたはこのようにそれを設定することができます。また、あなたは、例外のすべての種類を投げることができますし、あなたのビジネス層を修正することなく、適切に、後にWCFによって処理される例外を、障害に変換
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)
{
}
}
このtry/catchコードを適用してそこに変換します。
"スローex;"元のコールスタックを失いますが、 "throw;"ではない。 – Polyfun
tryの本体も同じようにキャッチしますか? – christopher
あなたは、ここでAspect Orientated Programmingをよく見ています - http://msdn.microsoft.com/en-us/library/aa288717%28v=vs.71%29.aspx。 PostSharpのような第三者ソリューションの多くは、これを正確に行う例外処理の側面を持っています。別の(悪い)解決策は、ローカルtryキャッチブロックを持つのではなく、アプリケーションレベル(たとえば、AppDomain_UnhandledExceptionなど)ですべての例外をキャッチすることです。私は実際にはローカルの例外処理にあなたを結びつけるか、try/catch(スロー)でコードを散らすので悪化します。 – dash