In diesem Abschnitt wird hauptsächlich auf die Aspekte in Bezug auf die Fehler- und Ausnahmebedingungsbehandlung eingegangen, die bei der Entwicklung benutzerdefinierter Erweiterungen für WebSphere Message Broker in C berücksichtigt werden sollten.Wenn Sie benutzerdefinierte Erweiterungen in Java entwickeln, können Sie die Java-Standardmethoden für die Fehler- und Ausnahmebedingungsbehandlung verwenden. Wenn WebSphere Message Broker beispielsweise intern eine Ausnahmebedingung auslöst, wird eine Java-Ausnahmebedingung der Klasse MbException zur Verfügung gestellt.
Die richtige Behandlung von Fehlern und Ausnahmebedingungen ist wichtig für einen fehlerfreien Brokerbetrieb. Dies sollten Sie beachten und wissen, wann und wie die benutzerdefinierte Erweiterung Fehler und Ausnahmebedingungen behandeln muss.
Der Nachrichtenbroker 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 Nachrichtenbrokers abgefangen.
Dienstprogrammfunktion verwenden die Rückgabewerte, um angeforderte Daten zurückzugeben, z. B. die Adresse oder interne 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 unten aufgeführten Rückkehrcodes zurückgegeben. Der Wert von returnCode kann immer als sicherer Hinweis dafür genommen werden, ob eine Dienstprogrammfunktion erfolgreich abgeschlossen wurde.
Dies bedeutet, dass eine benutzerdefinierte Erweiterung keine eigene Fehlerbehebung ausführen könnte. 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 erforderlicher 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.
Die benutzerdefinierte Erweiterung kann bei Bedarf eine eigene Fehlerbehebung
durchführen, indem returnCode auf einen Wert ungleich Null gesetzt wird.
Die Dienstprogrammfunktionsaufrufe kehren zur benutzerdefinierten Erweiterung zurück und übergeben
ihren Status im returnCode. Alle Ausnahmebedingungen, die in einer
Dienstprogrammfunktion auftreten, müssen an den Nachrichtenbroker übergeben werden, damit eine
zusätzliche Fehlerbehebung durchgeführt werden kann, d. h., wenn in returnCode der
Wert 'CCI_EXCEPTION' zurückgegeben wird. 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, so dass diese von anderen Schichten im
Nachrichtenbroker behandelt werden kann. Ähnlich 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 außer cciGetLastExceptionData,cciGetLastExceptionDataW oder cciRethrowLastException keine anderen Dienstprogrammfunktionen 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 Nachrichtenbroker 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 des Brokers geschrieben, sofern die Tracefunktion aktiviert wurde.
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: