Verwenden von Bindungshandles und Tätigen von RPC-Aufrufen
Ein häufiger Fehler bei RPC-Programmierern ist die Behandlung aller Ausnahmen. Viele Programmierer strukturieren ihre Ausnahmehandles wie folgt:
RpcTryExcept
{
RemoteSample();
}
RpcExcept(1)
{
log an error or do something else
}
RpcEndExcept
Das Problem mit diesem Handler ist, dass er alle Fehler abfängt, einschließlich der Fehler im Clientprogramm. Das Abfangen von Fehlern im Clientprogramm erschwert das Debuggen. Die richtige Methode zum Strukturieren eines Ausnahmehandlers ist die folgende:
RpcTryExcept
{
RemoteSample();
}
// Return "non-fatal" errors to clients. Catching fatal errors
// makes it harder to debug.
RpcExcept( ( ( (RpcExceptionCode() != STATUS_ACCESS_VIOLATION) &&
(RpcExceptionCode() != STATUS_POSSIBLE_DEADLOCK) &&
(RpcExceptionCode() != STATUS_INSTRUCTION_MISALIGNMENT) &&
(RpcExceptionCode() != STATUS_DATATYPE_MISALIGNMENT) &&
(RpcExceptionCode() != STATUS_PRIVILEGED_INSTRUCTION) &&
(RpcExceptionCode() != STATUS_ILLEGAL_INSTRUCTION) &&
(RpcExceptionCode() != STATUS_BREAKPOINT) &&
(RpcExceptionCode() != STATUS_STACK_OVERFLOW) &&
(RpcExceptionCode() != STATUS_HANDLE_NOT_CLOSABLE) &&
(RpcExceptionCode() != STATUS_IN_PAGE_ERROR) &&
(RpcExceptionCode() != STATUS_ASSERTION_FAILURE) &&
(RpcExceptionCode() != STATUS_STACK_BUFFER_OVERRUN) &&
(RpcExceptionCode() != STATUS_GUARD_PAGE_VIOLATION)
)
? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH ) )
{
log an error or do something else
}
RpcEndExcept
Dieser Ausnahmehandler hat den Vorteil, dass er einen bestimmten Fehlerbereich durchlassen kann. Diese Fehler werden nie vom Server zurückgegeben, da sie auf ein clientseitiges Problem hinweisen.
Darüber hinaus wird die Verwendung des strict-Kontexthandpunkts und der typ strict context [ _ _ ] [ _ _ _ handle-Attributeempfohlen, um sicherzustellen, dass die RPC-Laufzeit ein Kontexthand handle auf einer Schnittstelle erstellt, die nur als Argument an Methoden dieser Schnittstelle übergeben werden ] kann. Dadurch werden Serverfehler verhindert, die auftreten, wenn Kontexthandles geöffnet und zwischen verschiedenen Schnittstellen übergeben werden, die innerhalb desselben Prozesses vorhanden sind.