Traitement des exceptions vérifiées
Les méthodes des interfaces définies dans JMS 1.1 ou version antérieure émettent des exceptions vérifiées. La classe de base de ces exceptions est JMSException. Par conséquent, l'interception de JMSExceptions fournit un moyen générique de traiter ces types d'exceptions.
JMSException encapsule les informations suivantes:- Un message d'exception spécifique au fournisseur, que votre application peut obtenir en appelant la méthode
Throwable.getMessage(). - Un code d'erreur spécifique au fournisseur, que votre application peut obtenir en appelant la méthode
JMSException.getErrorCode(). - Une exception associée. Une exception émise par un appel API JMS 1.1 est souvent le résultat d'un problème de niveau inférieur qui est signalé par une autre exception liée à cette exception. Votre application peut obtenir une exception liée en appelant la méthode
JMSException.getLinkedException()ou la méthodeThrowable.getCause().
JMSException. Ces sous-classes implémentent l'interface com.ibm.msg.client.jms.JmsExceptionDetail , qui fournit les informations supplémentaires suivantes:- Explication du message d'exception. Votre application peut obtenir ce message en appelant la méthode
JmsExceptionDetail.getExplanation(). - Une réponse utilisateur recommandée à l'exception. Votre application peut obtenir ce message en appelant la méthode
JmsExceptionDetail.getUserAction(). - Les clés des insertions de message dans le message d'exception. Votre application peut obtenir un itérateur pour toutes les clés en appelant la méthode
JmsExceptionDetail.getKeys(). - Les insertions de message dans le message d'exception. Par exemple, une insertion de message peut être le nom de la file d'attente à l'origine de l'exception et il peut être utile pour votre application d'accéder à ce nom. Votre application peut obtenir l'insertion de message correspondant à une clé spécifiée en appelant la méthode
JmsExceptionDetail.getValue().
Toutes les méthodes de l'interface JmsExceptionDetail renvoient la valeur null si aucun détail n'est disponible.
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.
L'exception émise, com.ibm.msg.client.jms.DetailedInvalidDestinationException, est une sous-classe de la classe suivante et implémente l'interface com.ibm.msg.client.jms.JmsExceptionDetail .![[ Messagerie Jakarta 3.0]](ngjm30.gif)
jakarta.jms.InvalidDestinationException![[ JMS 2.0]](ngjms20.gif)
javax.jms.InvalidDestinationException
Exceptions associées
Une exception associée fournit des informations supplémentaires sur un incident d'exécution. Par conséquent, pour chaque JMSException émise, une application doit vérifier l'exception liée.
L'exception liée elle-même peut avoir une autre exception liée, de sorte que les exceptions liées forment une chaîne qui renvoie au problème sous-jacent d'origine. Une exception liée est implémentée à l'aide du mécanisme d'exception chaînée de la classe java.lang.Throwable , et votre application peut obtenir une exception liée en appelant la méthode Throwable.getCause() . Pour un JMSException, la méthode getLinkedException() délègue à la méthode 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
En général, chaque exception d'une chaîne est émise à partir d'une couche différente du code. Par exemple, les exceptions de la chaîne précédente sont émises par les couches suivantes :- La première exception, une instance d'une sous-classe de
JMSException, est émise par la couche commune dans IBM MQ classes for JMS. - L'exception suivante, une instance de
com.ibm.mq.MQException, est émise par le fournisseur de messagerie IBM MQ . - Les deux exceptions suivantes, qui sont toutes deux des instances de
com.ibm.mq.jmqi.JmqiException, sont émises par l'interface JMQI ( Java Message Queueing Interface). JMQI est le composant utilisé par IBM MQ classes for JMS pour communiquer avec un gestionnaire de files d'attente. - L'exception finale, une instance de
java.net.ConnectionException, est émise par la bibliothèque de classes Java .
![[ Messagerie Jakarta 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();
}
}
Notez que votre application doit toujours vérifier le type de chaque exception dans une chaîne car le type d'exception peut varier et les exceptions de différents types encapsulent des informations différentes.Obtention d'informations spécifiques à IBM MQ sur un problème
Les instances de com.ibm.mq.MQException et com.ibm.mq.jmqi.JmqiException encapsulent IBM MQ des informations spécifiques à un problème.
MQException encapsule les informations suivantes:- Un code achèvement, que votre application peut obtenir en appelant la méthode
getCompCode(). - Code anomalie que votre application peut obtenir en appelant la méthode
getReason().
Pour des exemples d'utilisation de ces méthodes, consultez l'exemple de code dans exceptions liées.
JmqiException encapsule également un code achèvement et un code anomalie. En outre, un JmqiException contient les informations dans un message AMQ nnnn ou CSQ nnnn , s'il est associé à l'exception. Votre application peut obtenir les différents composants de ce message en appelant les méthodes suivantes:- La méthode
getWmqMsgExplanation()renvoie l'explication du message AMQ nnnn ou CSQ nnnn . - La méthode
getWmqMsgSeverity()renvoie la gravité du message AMQ nnnn ou CSQ nnnn . - La méthode
getWmqMsgSummary()renvoie le récapitulatif du message AMQ nnnn ou CSQ nnnn . - La méthode
getWmqMsgUserResponse()renvoie la réponse utilisateur associée au message AMQ nnnn ou CSQ nnnn .