Strategien für den Umgang mit Fehlern in COM+
In diesem Thema werden mehrere Strategien für die Fehlerbehandlung beschrieben, die Sie bei der Entwicklung von COM+ Komponenten im Auge behalten sollten.
Geben Sie für alle Methoden in allen Komponentenschnittstellen einen HRESULT-Wert zurück. COM+ verwendet HRESULT-Werte, um Fehler bei Funktionsaufrufen oder Schnittstellenmethodenaufrufen zu liefern. Ein HRESULT zeigt an, ob eine Methode erfolgreich war oder fehlgeschlagen ist und identifiziert die mit dem Fehler verbundene Funktionalität, wie z. B. RPC, WIN32 oder ITF für schnittstellenspezifische Fehler. Außerdem bieten die System-APIs die Möglichkeit, von einem HRESULT auf eine Zeichenfolge zur Beschreibung des Fehlerzustands zurückzugreifen. Die Verwendung von Methoden, die HRESULT-Werte zurückgeben, ist für gut geschriebene Komponenten grundlegend und für den Debugging-Prozess unerlässlich. Microsoft Visual Basic definiert automatisch jede Methode mit einem HRESULT als Rückgabe. In Microsoft Visual C++ müssen Sie explizit einen HRESULT zurückgeben. Weitere Informationen über HRESULTs finden Sie unter Struktur von COM-Fehlercodes.
Initiieren Sie das ErrorInfo-Collection-Objekt mit den Mitteln, die Ihr Entwicklungs-Tool zur Verfügung stellt. ErrorInfo-Collection-Objekte werden oft als COM-Ausnahmen bezeichnet, weil sie einem Objekt die Möglichkeit bieten, umfangreiche Fehlerinformationen an seinen Aufrufer weiterzugeben (oder zu werfen), sogar über Objektgrenzen hinweg. Der Wert dieses generischen Fehlerobjekts besteht darin, dass es ein HRESULT ergänzt und damit die Art der Fehlerinformationen erweitert, die Sie an einen Aufrufer zurückgeben können. Jedes ErrorInfo-Collection-Objekt gibt eine Kontextbeschreibung, die Fehlerquelle und die Schnittstellenkennung der Methode zurück, die den Fehler verursacht hat. Sie können auch Verweise auf einen Eintrag in einer Hilfedatei einfügen. Automation bietet drei Schnittstellen zur Verwaltung des Fehlerobjekts. Ihre Komponente muss die Automation-Schnittstelle ISupportErrorInfo implementieren, um ihre Unterstützung für die ErrorInfoCollection anzuzeigen. Wenn ein Fehler auftritt, verwendet die Komponente die Automation-Schnittstelle ICreateErrorInfo, um ein Fehlerobjekt zu initialisieren. Nachdem der Aufrufer das HRESULT überprüft und festgestellt hat, dass der Methodenaufruf fehlgeschlagen ist, fragt er das Objekt ab, um festzustellen, ob es die ErrorInfo-Collection unterstützt. Ist dies der Fall, verwendet der Aufrufer die Automation-Schnittstelle IErrorInfo, um die Fehlerinformationen abzurufen. Visual Basic-Entwickler*innen haben einfachen Zugriff auf das ErrorInfo-Collection-Objekt, das über das Err-Objekt zugänglich ist. Sie können Fehler mit der Funktion Err Raise auslösen und Fehler mit der Anweisung On Error abfangen. Die Laufzeit-Schicht von Visual Basic übernimmt die Zuordnung für Sie. Wenn Sie den Visual C++ COM Compiler-Support verwenden, können Sie die Klasse _com_raise_error verwenden, um einen Fehler zu liefern, und die Klasse _com_error, um Fehlerinformationen abzurufen. COM+ überträgt traditionelle C++ Ausnahmen nicht als erweiterte IErrorInfo-Informationen. Weitere Informationen über das ErrorInfo-Collection-Objekt finden Sie unter „Fehlerbehandlung“ in der Anleitung zu Automation.
Hinweis
COM erfordert, dass alle ErrorInfo-Collection-Objekte nach Wert geordnet sind, was bedeutet, dass Komponenten, die die IErrorInfo-Automation-Schnittstelle implementieren, auch die IMarshal-Schnittstelle implementieren und unterstützen müssen. Die Implementierung der Schnittstelle IMarshal muss das Marshalling nach Wert für die Komponente unterstützen.
Verwenden Sie Transaktionen, um Ausfälle von gemeinsam genutzten Ressourcen zu verwalten. Automatische Transaktionen können den Umfang des Codes für die Fehlerbehandlung, den Sie bei der Verwendung von zustandsverwalteten Ressourcen-Managern schreiben müssen, erheblich reduzieren. Transaktionen machen die Fehlerbehandlung jedoch nicht gänzlich überflüssig. Sie müssen immer noch Fehlercodes von Ihren Schnittstellenmethoden zurückgeben und diese Fehlercodes innerhalb des Aufrufers überprüfen, um zu vermeiden, dass Sie unnötige Arbeit für eine fehlgeschlagene Transaktion leisten. Weitere Informationen zur Kombination von Fehlerbehandlung und Transaktionsverarbeitung finden Sie unter Beschleunigung von Transaktionen durch Benachrichtigung des Root-Objekts.
Lösen Sie Fehler explizit aus. Vermeiden Sie, dass Fehlerinformationen ein Objekt verlassen, es sei denn, das Objekt löst den Fehler explizit aus. Fangen Sie alle vom Tool generierten Fehler ab, und behandeln Sie sie in Ihrem Komponenten-Code. Fügen Sie zumindest einen Standard-Handler ein, um unerwartete Fehler auf konsistente Weise zu liefern.
Verwenden Sie den Fehlerbereich FACILITY_ITF, um schnittstellenspezifische Fehler zu liefern. Schnittstellenspezifische Fehler sollten im FACILITY_ITF-Fehlerbereich zwischen 0x0200 und 0xFFFF liegen. Sie können einen angepassten Code in Visual Basic als Offset von vbObjectError definieren. Verwenden Sie das Makro MAKE_HRESULT in C++, um einen schnittstellenspezifischen Code einzuführen, wie im folgenden Beispiel gezeigt:
const HRESULT ERROR_NUMBER = MAKE_HRESULT (SEVERITY_ERROR, FACILITY_ITF, 10);
Zugehörige Themen