2013-07-29 158 views
0

我实现了WCF跟踪与此代码:捕获尝试捕捉异常

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" switchValue="All" 
     propagateActivity="true"> 
     <listeners> 
      <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
      </add> 
      <add name="xml"> 
      <filter type="" /> 
      </add> 
     </listeners> 
     </source> 
     <source name="CardSpace" switchValue="All"> 
     <listeners> 
      <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
      </add> 
      <add name="xml"> 
      <filter type="" /> 
      </add> 
     </listeners> 
     </source> 
     <source name="System.IO.Log" switchValue="All"> 
     <listeners> 
      <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
      </add> 
      <add name="xml"> 
      <filter type="" /> 
      </add> 
     </listeners> 
     </source> 
     <source name="System.Runtime.Serialization" switchValue="All"> 
     <listeners> 
      <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
      </add> 
      <add name="xml"> 
      <filter type="" /> 
      </add> 
     </listeners> 
     </source> 
     <source name="System.IdentityModel" switchValue="All"> 
     <listeners> 
      <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
      </add> 
      <add name="xml"> 
      <filter type="" /> 
      </add> 
     </listeners> 
     </source> 
     <source name="System.ServiceModel.MessageLogging" switchValue="All"> 
     <listeners> 
      <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type="" /> 
      </add> 
      <add name="ServiceModelMessageLoggingListener"> 
      <filter type="" /> 
      </add> 
     </listeners> 
     </source> 
    </sources> 
    <sharedListeners> 
     <add initializeData="c:\wcflogs\trace.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
     name="Default" traceOutputOptions="Timestamp"> 
     <filter type="" /> 
     </add> 
    </sharedListeners> 
    <trace autoflush="true" /> 
    </system.diagnostics> 

    <system.serviceModel> 
    <diagnostics wmiProviderEnabled="true"> 
     <messageLogging logEntireMessage="true" logMalformedMessages="true" 
     logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" 
     maxMessagesToLog="500" maxSizeOfMessageToLog="5000" /> 
    </diagnostics> 
    </system.serviceModel> 

,但它仅跟踪被抛出try/catch块外产生的异常,所以当我想有这样的例外在我跟踪我需要删除try/catch块。在我的WCF跟踪中,是否有任何方法可以从try {}中产生此异常?

+0

的事件,我不这么认为,因为你的代码是处理异常(通过try/catch块)。如果要捕获try/catch块内的异常,请将它们记录到'catch'内的文件或数据库中。 – Tim

+0

是的,我正在捕获异常并将它们记录到数据库中,但也许还有其他方法可以在我的跟踪文件中使用它 –

回答

0

只需将其他源添加到您的配置文件。您仍然应该能够使用共享侦听器。我认为。

<system.diagnostics> 
    <sources> 
    <source name="HandledExceptions" switchValue="All"> 
    <listeners> 
    <add initializeData="HandledExceptions.svclog" type="System.Diagnostics.XmlWriterTraceListener" name="HandledExceptionListener"> 
     <filter type="" /> 
    </add> 
    </listeners> 
    </source> 
    </sources> 
    <trace autoflush="true" /> 
</system.diagnostics> 

,然后编写代码

catch (FaultException fe) 
{ 
    TraceSource trace = new TraceSource("HandledExceptions"); 
    trace.TraceEvent(TraceEventType.Warning, 0, fe.Message + System.Environment.NewLine + fe.StackTrace); 
    trace.Flush(); 
    trace.Close(); 

    throw fe; 
} 
catch (Exception e) 
{ 
    TraceSource trace = new TraceSource("HandledExceptions"); 
    trace.TraceEvent(TraceEventType.Critical, 0, e.Message + System.Environment.NewLine + e.StackTrace); 
    trace.Flush(); 
    trace.Close(); 

    throw new FaultException(e.Message); 
}