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. Daher müssen Sie 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, wie beispielsweise die Adresse oder interne Kennung eines Brokerobjekts. Hin und wieder weist der Rückgabewert auch 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 returnCode-Argument 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 Fehlerbehebung durchführen. Wird CCI_EXCEPTION zurückgegeben, müssen alle Ausnahmebedingungen für eine zusätzliche Fehlerbehebung an den Nachrichtenbroker zurückgegeben werden. Dazu wird die Funktion cciRethrowLastException aufgerufen, wodurch die C-Schnittstelle die letzte Ausnahmebedingung erneut auslöst, so dass diese von anderen Schichten im Nachrichtenbroker behandelt werden kann.
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, wird zu unvorhersehbarem Verhalten führen 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, mit denen eine benutzerdefinierte Erweiterung benachrichtigt 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: