Behandlung von geprüften Ausnahmen

Methoden in den Schnittstellen, die in JMS 1.1 oder früher definiert sind, lösen geprüfte Ausnahmen aus. Die Basisklasse für diese Ausnahmen ist JMSException. Daher bietet das Abfangen von JMSExceptions eine generische Möglichkeit, diese Typen von Ausnahmen zu behandeln.

Jede JMSException enthält die folgenden Informationen:
  • Eine providerspezifische Ausnahmebedingungsnachricht, die Ihre Anwendung durch Aufrufen der Methode Throwable.getMessage() abrufen kann.
  • Ein providerspezifischer Fehlercode, den Ihre Anwendung durch Aufrufen der Methode JMSException.getErrorCode() abrufen kann.
  • Eine verlinkte Ausnahmebedingung. Eine Ausnahmebedingung, die von einem API-Aufruf JMS 1.1 ausgelöst wird, ist häufig das Ergebnis eines Problems einer niedrigeren Ebene, das von einer anderen Ausnahmebedingung gemeldet wird, die mit dieser Ausnahmebedingung verknüpft ist. Ihre Anwendung kann eine verlinkte Ausnahmebedingung abrufen, indem sie entweder die Methode JMSException.getLinkedException() oder die Methode Throwable.getCause() aufruft.
Wenn Sie die JMS 1.1-API verwenden, sind die meisten Ausnahmebedingungen, die von IBM® MQ classes for JMS ausgelöst werden, Instanzen von Unterklassen von JMSException. Diese Unterklassen implementieren die Schnittstelle com.ibm.msg.client.jms.JmsExceptionDetail, die die folgenden zusätzlichen Informationen bereitstellt:
  • Eine Erläuterung der Ausnahmebedingungsnachricht. Ihre Anwendung kann diese Nachricht durch Aufrufen der Methode JmsExceptionDetail.getExplanation() abrufen.
  • Eine empfohlene Benutzeraktion für die Ausnahmebedingung. Ihre Anwendung kann diese Nachricht durch Aufrufen der Methode JmsExceptionDetail.getUserAction() abrufen.
  • Die Schlüssel für die Einfügungen in der Ausnahmebedingungsnachricht. Ihre Anwendung kann einen Iterator für alle Schlüssel durch Aufrufen der Methode JmsExceptionDetail.getKeys() abrufen.
  • Die Nachrichteneinfügungen in der Ausnahmebedingungsnachricht. Eine Nachrichteneinfügung kann zum Beispiel der Name der Warteschlange sein, die die Ausnahmebedingung verursacht hat, und es kann nützlich für Ihre Anwendung sein, auf diesen Namen zuzugreifen. Ihre Anwendung kann die Nachrichteneinfügung, die einem angegebenen Schlüssel entspricht, durch Aufrufen der Methode JmsExceptionDetail.getValue() abrufen.

Alle Methoden in der Schnittstelle JmsExceptionDetail geben null zurück, wenn keine Details verfügbar sind.

Wenn eine Anwendung beispielsweise versucht, einen Nachrichtenproduzenten für eine IBM MQ -Warteschlange zu erstellen, die nicht vorhanden ist, wird eine Ausnahme mit den folgenden Informationen ausgelöst:
Message : JMSWMQ2008: Failed to open MQ queue 'Q_test'.
Class : class com.ibm.msg.client.jms.DetailedInvalidDestinationException
Error Code : JMSWMQ2008
Explanation : JMS attempted to perform an MQOPEN, but IBM MQ reported an
              error.
User Action : Use the linked exception to determine the cause of this error. Check
              that the specified queue and queue manager are defined correctly.
Die ausgelöste Ausnahmebedingung com.ibm.msg.client.jms.DetailedInvalidDestinationExceptionist eine Unterklasse der folgenden Klasse und implementiert die Schnittstelle com.ibm.msg.client.jms.JmsExceptionDetail .
  • [Jakarta Messaging 3.0 ]jakarta.jms.InvalidDestinationException
  • [JMS 2.0 ]javax.jms.InvalidDestinationException

Verlinkte Ausnahmebedingungen

Eine verlinkte Ausnahmebedingung liefert weitere Informationen zu einem Laufzeitproblem. Daher sollte eine Anwendung für jede JMSException, die ausgelöst wird, die verknüpfte Ausnahme überprüfen.

Die verlinkte Ausnahmebedingung kann wiederum ihrerseits eine weitere verlinkte Ausnahmebedingung haben, sodass die verlinkten Ausnahmebedingungen eine Kette bilden, die zu dem zugrunde liegenden Problem zurückführt. Eine verlinkte Ausnahmebedingung wird mithilfe des Mechanismus für verkettete Ausnahmebedingungen der Klasse java.lang.Throwable implementiert, und Ihre Anwendung kann eine verlinkte Ausnahmebedingung durch Aufrufen der Methode Throwable.getCause() abrufen. Bei einem JMSException delegiert die Methode getLinkedException() an die Methode Throwable.getCause().

Wenn eine Anwendung beispielsweise bei der Verbindung mit einem Warteschlangenmanager eine falsche Portnummer angibt, bilden die Ausnahmebedingungen die folgende Kette:
com.ibm.msg.client.jms.DetailIllegalStateException
|
+--->
    com.ibm.mq.MQException
    |
    +--->
        com.ibm.mq.jmqi.JmqiException
        |
        +--->
            com.ibm.mq.jmqi.JmqiException
            |
            +--->
                java.net.ConnectionException
Normalerweise wird jede Ausnahmebedingung in einer Kette von einer anderen Schicht im Code ausgelöst. In der oben genannten Kette wurden die Ausnahmebedingungen beispielsweise von folgenden Schichten ausgelöst:
  • Die erste Ausnahme, eine Instanz einer Unterklasse von JMSException, wird von der allgemeinen Schicht in IBM MQ classes for JMSausgelöst.
  • Die nächste Ausnahme, eine Instanz von com.ibm.mq.MQException, wird vom IBM MQ-Messaging-Provider ausgelöst.
  • Die nächsten beiden Ausnahmen, die beide Instanzen von com.ibm.mq.jmqi.JmqiExceptionsind, werden von der Java Message Queueing Interface (JMQI) ausgelöst. JMQI ist die Komponente, die von IBM MQ classes for JMS für die Kommunikation mit einem Warteschlangenmanager verwendet wird.
  • Die letzte Ausnahmebedingung, eine Instanz von java.net.ConnectionException, wird von der Java-Klassenbibliothek ausgelöst.
Weitere Informationen zu der Schichtarchitektur von IBM MQ classes for JMS finden Sie im Abschnitt IBM MQ-Klassen für JMS-Architektur.
Sie können Ihre Anwendung so codieren, dass diese Kette durchlaufen wird, um alle geeigneten Informationen zu extrahieren, wie im folgenden Beispiel gezeigt wird: [Jakarta Messaging 3.0 ]

import com.ibm.msg.client.jms.JmsExceptionDetail;
import com.ibm.mq.MQException;
import com.ibm.mq.jmqi.JmqiException;
import jakarta.jms.JMSException;
.
.
.
catch (JMSException je) {
  System.err.println("Caught JMSException");
  // Check for linked exceptions in JMSException
  Throwable t = je;
  while (t != null) {
    // Write out the message that is applicable to all exceptions
    System.err.println("Exception Msg: " + t.getMessage());
    // Write out the exception stack trace
    t.printStackTrace(System.err);

    // Add on specific information depending on the type of exception
    if (t instanceof JMSException) {
      JMSException je1 = (JMSException) t;
      System.err.println("JMS Error code: " + je1.getErrorCode());
      if (t instanceof JmsExceptionDetail){
        JmsExceptionDetail jed = (JmsExceptionDetail)je1;
        System.err.println("JMS Explanation: " + jed.getExplanation());
        System.err.println("JMS Explanation: " + jed.getUserAction());
      }
    } else if (t instanceof MQException) {
      MQException mqe = (MQException) t;
      System.err.println("WMQ Completion code: " + mqe.getCompCode());
      System.err.println("WMQ Reason code: " + mqe.getReason());
    } else if (t instanceof JmqiException){
      JmqiException jmqie = (JmqiException)t;
      System.err.println("WMQ Log Message: " + jmqie.getWmqLogMessage());
      System.err.println("WMQ Explanation: " + jmqie.getWmqMsgExplanation());
      System.err.println("WMQ Msg Summary: " + jmqie.getWmqMsgSummary());
      System.err.println("WMQ Msg User Response: " + jmqie.getWmqMsgUserResponse());
      System.err.println("WMQ Msg Severity: " + jmqie.getWmqMsgSeverity());
    }
    // Get the next cause
    t = t.getCause();
  }
}
[JMS 2.0 ]

import com.ibm.msg.client.jms.JmsExceptionDetail;
import com.ibm.mq.MQException;
import com.ibm.mq.jmqi.JmqiException;
import javax.jms.JMSException;
.
.
.
catch (JMSException je) {
  System.err.println("Caught JMSException");
  // Check for linked exceptions in JMSException
  Throwable t = je;
  while (t != null) {
    // Write out the message that is applicable to all exceptions
    System.err.println("Exception Msg: " + t.getMessage());
    // Write out the exception stack trace
    t.printStackTrace(System.err);

    // Add on specific information depending on the type of exception
    if (t instanceof JMSException) {
      JMSException je1 = (JMSException) t;
      System.err.println("JMS Error code: " + je1.getErrorCode());
      if (t instanceof JmsExceptionDetail){
        JmsExceptionDetail jed = (JmsExceptionDetail)je1;
        System.err.println("JMS Explanation: " + jed.getExplanation());
        System.err.println("JMS Explanation: " + jed.getUserAction());
      }
    } else if (t instanceof MQException) {
      MQException mqe = (MQException) t;
      System.err.println("WMQ Completion code: " + mqe.getCompCode());
      System.err.println("WMQ Reason code: " + mqe.getReason());
    } else if (t instanceof JmqiException){
      JmqiException jmqie = (JmqiException)t;
      System.err.println("WMQ Log Message: " + jmqie.getWmqLogMessage());
      System.err.println("WMQ Explanation: " + jmqie.getWmqMsgExplanation());
      System.err.println("WMQ Msg Summary: " + jmqie.getWmqMsgSummary());
      System.err.println("WMQ Msg User Response: " + jmqie.getWmqMsgUserResponse());
      System.err.println("WMQ Msg Severity: " + jmqie.getWmqMsgSeverity());
    }
    // Get the next cause
    t = t.getCause();
  }
}
Beachten Sie, dass Ihre Anwendung immer den Typ jeder einzelnen Ausnahmebedingung in einer Kette überprüfen sollte, da der Typ variieren kann und verschiedene Ausnahmebedingungstypen verschiedene Informationen einbinden.

IBM MQ -spezifische Informationen zu einem Fehler abrufen

Instanzen von com.ibm.mq.MQException und com.ibm.mq.jmqi.JmqiException kapseln IBM MQ spezifische Informationen zu einem Problem.

Ein MQException enthält die folgenden Informationen:
  • Einen Beendigungscode, den Ihre Anwendung durch Aufrufen der Methode getCompCode() abrufen kann.
  • Einen Ursachencode, den Ihre Anwendung durch Aufrufen der Methode getReason() abrufen kann.

Beispiele für die Verwendung dieser Methoden finden Sie im Beispielcode unter Verknüpfte Ausnahmen.

Ein JmqiException kapselt auch einen Beendigungscode und einen Ursachencode. Darüber hinaus enthält ein JmqiException die Informationen in einer AMQ-Nnnn oder CSQ-Nnnn Nachricht, wenn der Ausnahmebedingung eine zugeordnet ist. Ihre Anwendung kann die verschiedenen Komponenten dieser Nachricht abrufen, indem Sie folgende Methoden aufruft:
  • Die Methode getWmqMsgExplanation() gibt die Erläuterung der Nachricht AMQ-Nnnn oder CSQ-Nnnn zurück.
  • Die Methode getWmqMsgSeverity() gibt die Wertigkeit der Nachricht AMQ-Nnnn oder CSQ-Nnnn zurück.
  • Die Methode getWmqMsgSummary() gibt die Zusammenfassung der Nachricht AMQ-Nnnn oder CSQ-Nnnn zurück.
  • Die Methode getWmqMsgUserResponse() gibt die Benutzeraktion zurück, die der Nachricht AMQ-Nnnn oder CSQ-Nnnn zugeordnet ist.