code: private void callExceptionListener(JMSException e) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(this, tc, "callExceptionListener");
  
          // Get the latest version of the ExceptionListener (after this point we're
          // going to call that one regardless of whether it changes
          ExceptionListener elLocal = elRef.get();
          if (elLocal != null) {
              // Protect our code from badly behaved exception listeners.
              try {
                  // Trace the class and hashcode of the exception
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      SibTr.debug(this, tc, "Exception handler class: " + elLocal.getClass().getName());
                      SibTr.debug(this, tc, "Exception: ", e);
                  }
  
                  // Pass the exception on.
                  elLocal.onException(e);
              } catch (RuntimeException exc) {
                  // No FFDC code needed
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                      SibTr.debug(this, tc, "User ExceptionListener threw exception", exc);
              }
          }
          else {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  SibTr.debug(this, tc, "No exception listener is currently set for this connection.");
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(this, tc, "callExceptionListener");
      }
docs: /*
  (non-Javadoc)
  
  @see com.ibm.ws.sib.api.jms.JmsConnection#reportException(javax.jms.JMSException)
  This method directly invokes any registered exception listener.
  No locks are taken by this method, so it is the caller's responsibility to
  take any locks that may be needed.