Verwenden von Bindungshandles und Tätigen von RPC-Aufrufen
Ein häufiger Fehler unter 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 besteht darin, dass er alle Fehler abfangen, 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 durchlässt. Diese Fehler werden vom Server nie zurückgegeben, da sie auf ein clientseitiges Problem hinweisen.
Darüber hinaus wird die Verwendung der Attribute [strict_context_handle] und [type_strict_context_handle] empfohlen, um sicherzustellen, dass die RPC-Laufzeit ein Kontexthandle für eine 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.
Zugehörige Themen