Freigeben über


Fehler nach Ausnahmen angeben

Bei herkömmlichen C-Programmierern werden Fehler häufig durch Rückgabewerte oder einen speziellen [out]-Parameter zurückgegeben, der den Fehlercode zurückgibt. Dies führt zu Schnittstellen, die wie folgt implementiert werden:

long sample(...)
{
    ...
    p = new Cbar(...);
    if (p == NULL)
    {
        // cleanup
        ...
        return ERROR_OUTOFMEMORY;
    }
}

Das Problem bei diesem Ansatz besteht darin, dass RPC-Rückgabewerte einfach lange ganze Zahlen sind. Sie haben keine besondere Bedeutung als Fehler (beachten Sie, dass error_status_t keine spezielle Semantik auf der Serverseite hat), was wichtige Auswirkungen hat.

Zunächst wird RPC nicht darüber informiert, dass der Vorgang fehlgeschlagen ist; es versucht, alle Argumente [in, out] und [out] zu entmarsen. Die Fehlersemantik von Kontexthandles unterscheidet sich ebenfalls. Das an den Client zurückgegebene Paket ist im Wesentlichen ein Erfolgspaket, wobei der Fehlercode tief im Paket begraben ist. Dies bedeutet auch, dass RPC keine erweiterten Fehlerinformationen verwendet, sodass Clientsoftware häufig nicht erkennen kann, wo der Anruf fehlgeschlagen ist.

Das Angeben von Fehlern in RPC-Serverroutinen durch Auslösen von Seh-Ausnahmen (Structured Exception Handling, Seh) (nicht C++) ist ein wesentlich besserer Ansatz. Wenn eine SEH-Ausnahme ausgelöst wird, wechselt das Steuerelement direkt zur RPC-Laufzeit. Ein Fehler tritt manchmal tief in einer Routine auf, die nicht ordnungsgemäß bereinigt werden kann, und es muss einen Fehler für den Aufrufer angeben. Die Routine sollte einen Fehler an den Aufrufer zurückgeben, der wiederum einen Fehler an seinen Aufrufer zurückgeben kann usw. Die letzte Serverroutine im Stapel sollte jedoch eine Ausnahme auslösen, bevor sie an RPC zurückkehrt, um anzugeben, dass ein Fehler aufgetreten ist.

Ausnahmebehandlung