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.
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 MethodeThrowable.getCause()aufruft.
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.
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 ]](ngjm30.gif)
jakarta.jms.InvalidDestinationException![[JMS 2.0 ]](ngjms20.gif)
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().
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.
![[Jakarta Messaging 3.0 ]](ngjm30.gif)
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 ]](ngjms20.gif)
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.
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.
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.