Die richtige Behandlung von Fehlern und Ausnahmebedingungen ist wichtig für einen fehlerfreien Brokerbetrieb. Dazu sollten Sie sich überlegen, wie und wann Ihre benutzerdefinierte Erweiterung Fehler und Ausnahmebedingungen behandeln muss.
Die in diesem Abschnitt beschriebenen Aspekte der Fehler- und Ausnahmebedingungsbehandlung betreffen Sie in erster Linie dann, wenn Sie benutzerdefinierte Erweiterungen für WebSphere Message Broker in der Programmiersprache C entwickeln. Wenn Sie benutzerdefinierte Erweiterungen in der Programmiersprache Java™ entwickeln, können Sie für die Fehler- und Ausnahmebedingungsbehandlung die Standardmethoden von Java verwenden. Wenn beispielsweise WebSphere Message Broker intern eine Ausnahmebedingung auslöst, wird Ihnen eine Java-Ausnahmebedingung der Klasse MbException zur Verfügung gestellt.
Der Broker generiert C++-Ausnahmebedingungen, um Fehlerbedingungen zu behandeln. Diese Ausnahmebedingungen werden in den relevanten Softwareschichten im Broker abgefangen und entsprechend behandelt. Allerdings können Programme, die in C geschrieben wurden, keine C++-Ausnahmebedingungen abfangen; alle ausgelösten Ausnahmebedingungen werden in benutzerdefiniertem Erweiterungscode, der in C erstellt wurde, ignoriert und in den höheren Schichten des Brokers abgefangen.
Dienstprogrammfunktionen verwenden die Rückkehrwerte in der Regel zur Rückgabe der angeforderten Daten, z. B. der Adresse oder internen Kennung eines Brokerobjekts. Hin und wieder weist der Rückgabewert darauf hin, dass ein Fehler aufgetreten ist. So wird beispielsweise ein Nullwert (CCI_NULL_ADDR) zurückgegeben, wenn die Adresse oder die interne Kennung eines Brokerobjekts nicht abgerufen werden konnte. Darüber hinaus wird die Ursache einer Fehlerbedingung im Ausgabeparameter für den Rückkehrcode gespeichert, der gewöhnlich Teil des Funktionsprototyps aller Dienstprogrammfunktionen ist. Wenn die Dienstprogrammfunktion erfolgreich ausgeführt wurde und der Rückkehrcode (returnCode) ungleich null ist, dann enthält returnCode den Wert 'CCI_SUCCESS'. Andernfalls wird einer der hier aufgeführten Rückkehrcodes zurückgegeben. Der Wert von returnCode gibt Aufschluss darüber, ob eine Dienstprogrammfunktion erfolgreich abgeschlossen wurde.
Daher kann eine benutzerdefinierte Erweiterung nicht ihre eigene Fehlerbehebung durchführen. Wenn der returnCode-Parameter allerdings angegeben wurde und eine Ausnahmebedingung ausgelöst wird, dann wird 'CCI_EXCEPTION' als Rückkehrcode zurückgegeben. In diesem Fall können mit der Funktion cciGetLastExceptionData oder cciGetLastExceptionDataW Diagnoseinformationen zum vorliegenden Ausnahmetyp eingeholt werden. (Der Unterschied zwischen den beiden Funktionen ist, dass cciGetLastExceptionDataW eine CCI_EXCEPTION_WIDE_ST-Struktur zurückgibt, die Unicode-Trace-Text enthalten kann.) Die Daten werden in der CCI_EXCEPTION_ST- bzw. CCI_EXCEPTION_WIDE_ST-Struktur zurückgegeben.
Wenn keine Ressourcen freigegeben werden müssen, sollte das Argument 'returnCode' in der benutzerdefinierten Erweiterung nicht gesetzt werden. Wird dieses Argument nicht gesetzt, bleiben Ausnahmebedingungen in der benutzerdefinierten Erweiterung unbemerkt. Diese Ausnahmebedingungen können dann in den höheren Schichten des WebSphere Message Broker-Stacks vom Broker selbst behandelt werden.
Die Nachrichteneinfügungen können in den CCI_STRING_ST-Members der CCI_EXCEPTION_ST-Struktur zurückgegeben werden. Durch die CCI_STRING_ST-Struktur kann die benutzerdefinierte Erweiterung einen Puffer für den Empfang der erforderlichen Einfügungen zur Verfügung stellen. Der Broker kopiert die Daten in diesen Puffer und gibt die Anzahl der ausgegebenen Bytes sowie die tatsächliche Länge der Daten zurück. Wenn der Puffer nicht ausreicht, werden keine Daten kopiert; der Puffer kann allerdings ggf. über das "dataLength"-Member vergrößert werden.
In der benutzerdefinierten Erweiterung kann returnCode auf einen Wert ungleich null gesetzt werden. Dadurch kann die Erweiterung bei Bedarf eine eigene Fehlerbehebung bereitstellen. Die Dienstprogrammfunktionsaufrufe kehren zur benutzerdefinierten Erweiterung zurück und übergeben ihren Status im returnCode. Alle Ausnahmebedingungen, die in einer Dienstprogrammfunktion auftreten (d. h., wenn returnCode den Wert 'CCI_EXCEPTION' zurückgibt), müssen an den Broker übergeben werden, damit eine zusätzliche Fehlerbehebung durchgeführt werden kann. Rufen Sie zu diesem Zweck cciRethrowLastException auf, nachdem die benutzerdefinierte Erweiterung ihre eigene Fehlerbehandlung beendet hat. Der Aufruf von cciRethrowLastException veranlasst die C-Schnittstelle, die letzte Ausnahmebedingung erneut auszulösen, sodass diese von anderen Schichten im Broker behandelt werden kann. Wie bei dem C-Aufruf exit wird cciRethrowLastException in diesem Fall nicht zurückgegeben.
Wenn eine Ausnahmebedingung auftritt und von einer benutzerdefinierten Erweiterung abgefangen wird, darf die Erweiterung keine Dienstprogrammfunktionen mit Ausnahme von cciGetLastExceptionData,cciGetLastExceptionDataW oder cciRethrowLastException aufrufen. Jeder Versuch, eine andere Dienstprogrammfunktion aufzurufen, führt zu einem unvorhersehbaren Verhalten und kann unter Umständen nachteilige Auswirkungen auf die Brokerintegrität haben.
Wenn eine benutzerdefinierte Erweiterung einen schwerwiegenden Fehler feststellt, kann über cciThrowException oder cciThrowExceptionW eine Ausnahmebedingung erstellt werden, die dann vom Broker auf korrekte Weise behandelt wird. Durch die Generierung einer solchen Ausnahmebedingung werden die zur Verfügung gestellten Daten in das Systemprotokoll (syslog oder Ereignisanzeige) geschrieben, falls die Ausnahmebedingung nicht behandelt wird. Diese Daten werden auch in das Traceprotokoll geschrieben, sofern die Tracefunktion aktiviert ist.
Der Broker erstellt eine Reihe von Ausnahmebedingungen, die an eine benutzerdefinierte Erweiterung übergeben werden kann. Diese Ausnahmebedingungen können auch von einer benutzerdefinierten Erweiterung beim Auftreten einer Fehlerbedingung generiert werden. Bei den Ausnahmeklassen handelt es sich um folgende: