logback-android/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java
public void process(Context context, Converter<ILoggingEvent> head) {
    if(head == null) {
      // this should never happen
      throw new IllegalArgumentException("cannot process empty chain");
    }
    if (!chainHandlesThrowable(head)) {
      Converter<ILoggingEvent> tail = ConverterUtil.findTail(head);
      Converter<ILoggingEvent> exConverter = null;
      LoggerContext loggerContext = (LoggerContext) context;
      if (loggerContext.isPackagingDataEnabled()) {
        exConverter = new ExtendedThrowableProxyConverter();
      } else {
        exConverter = new ThrowableProxyConverter();
      }
      tail.setNext(exConverter);
    }
  }
public void process(Context context, Converter<ILoggingEvent> head) {
    if(head == null) {
      // this should never happen
      throw new IllegalArgumentException("cannot process empty chain");
    }
    if (!chainHandlesThrowable(head)) {
      Converter<ILoggingEvent> tail = ConverterUtil.findTail(head);
      Converter<ILoggingEvent> exConverter = null;
      LoggerContext loggerContext = (LoggerContext) context;
      if (loggerContext.isPackagingDataEnabled()) {
        exConverter = new ExtendedThrowableProxyConverter();
      } else {
        exConverter = new ThrowableProxyConverter();
      }
      tail.setNext(exConverter);
    }
  }
public void process ( Context context , Converter < ILoggingEvent > head ) { if ( head == null ) { // this should never happen throw new IllegalArgumentException ( "cannot process empty chain" ) ; } if ( ! chainHandlesThrowable ( head ) ) { Converter < ILoggingEvent > tail = ConverterUtil . findTail ( head ) ; Converter < ILoggingEvent > exConverter = null ; LoggerContext loggerContext = ( LoggerContext ) context ; if ( loggerContext . isPackagingDataEnabled ( ) ) { exConverter = new ExtendedThrowableProxyConverter ( ) ; } else { exConverter = new ThrowableProxyConverter ( ) ; } tail . setNext ( exConverter ) ; } }
This implementation checks if any of the converters in the chain handles
exceptions. If not, then this method adds a
{@link ThrowableProxyConverter} instance to the end of the chain.
<p>
This allows appenders using this layout to output exception information
event if the user forgets to add %ex to the pattern. Note that the
appenders defined in the Core package are not aware of exceptions nor
LoggingEvents.
<p>
If for some reason the user wishes to NOT print exceptions, then she can
add %nopex to the pattern.
This implementation checks if any of the converters in the chain handles exceptions . If not then this method adds a { @link ThrowableProxyConverter } instance to the end of the chain . <p > This allows appenders using this layout to output exception information event if the user forgets to add %ex to the pattern . Note that the appenders defined in the Core package are not aware of exceptions nor LoggingEvents . <p > If for some reason the user wishes to NOT print exceptions then she can add %nopex to the pattern .