Freigeben über


Fehler nach Ausnahmen angeben

Bei herkömmlichen C-Programmierern werden Fehler häufig über 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.

Erstens wird RPC nicht darüber benachrichtigt, dass der Vorgang fehlgeschlagen ist. 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 enthalten ist. Dies bedeutet auch, dass RPC keine erweiterten Fehlerinformationen verwendet, sodass Clientsoftware häufig nicht erkennen kann, wo der Aufruf fehlgeschlagen ist.

Das Angeben von Fehlern in RPC-Serverroutinen durch Auslösen von SEH-Ausnahmen (Structured Exception Handling, strukturierte Ausnahmebehandlung) (nicht C++) ist ein viel besserer Ansatz. Wenn eine SEH-Ausnahme ausgelöst wird, wechselt die Steuerung direkt zur RPC-Laufzeit. Ein Fehler tritt manchmal tief in einer Routine auf, die nicht ordnungsgemäß sauber kann und dem Aufrufer einen Fehler anzeigen muss. Die Routine sollte einen Fehler an ihren Aufrufer zurückgeben, der wiederum einen Fehler an den Aufrufer zurückgeben kann usw. Die letzte Serverroutine im Stapel sollte jedoch eine Ausnahme auslösen, bevor sie zu RPC zurückkehrt, um RPC anzuzeigen, dass ein Fehler aufgetreten ist.

Ausnahmebehandlung