docs: public synchronized Exception getException(Conversation conversation)
     {
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "getException", conversation);
  
        checkReleased();
  
        // The top level exception we want to return at the end
        Exception topException = null;
  
        if (receivedBuffer != null)
        {
           // Read the number of exceptions returned
           short numberOfExceptions = getShort();
  
           // A handle on the last exception in the chain that new ones should link to
           Exception link = null;
  
           for (int x = 0; x < numberOfExceptions; x++)
           {
              short exceptionId = getShort();
              Exception e = parseSingleException(exceptionId);
  
              // Is this the first exception? If so, save it away in its proper place and save the
              // handle of the exception to place the link the next time (also the top level exception)
              if (topException == null)
              {
                 topException = e;
                 link = topException;
              }
              // Otherwise, link the exception we just got with the last one we just got
              else
              {
                 link.initCause(e);
                 link = e;
              }
           }
        }
  
        final HandshakeProperties handshakeProperties = conversation.getHandshakeProperties();
        if ((handshakeProperties != null) &&
            ((CATHandshakeProperties)handshakeProperties).isFapLevelKnown())
        {
           // If we don't know hte FAP level, at this point in time, then assume a pre-FAP 9
           // version.  This could happen if an exception is thrown during handshaking.
  
           final int fapLevel = ((CATHandshakeProperties)handshakeProperties).getFapLevel();
           if (fapLevel >= JFapChannelConstants.FAP_VERSION_9)
           {
              // At FAP version 9 or greater, exceptions are encoded to include a reason
              // and inserts.  Retrieve these.
              int reason = getInt();
              String[] inserts = Reasonable.DEFAULT_INSERTS;
              int numberOfInserts = getShort();
              if (numberOfInserts > 0)
              {
                 inserts = new String[numberOfInserts];
                 for (int i=0; i < numberOfInserts; ++i)
                 {
                    inserts[i] = getString();
                 }
              }
  
              // Stuff reason and inserts back into the chain of exceptions
              setReasonableInformation(topException, reason, inserts);
           }
        }
  
        if (TraceComponent.isAnyTracingEnabled() && topException != null) {
          CommsLightTrace.traceException(tc, topException);
        }
  
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(tc, "getException", topException);
        return topException;
     }