Uso di handle di associazione ed esecuzione di chiamate RPC
Un errore comune tra i programmatori RPC è la gestione di tutte le eccezioni. Molti programmatori strutturano gli handle di eccezione come segue:
RpcTryExcept
{
RemoteSample();
}
RpcExcept(1)
{
log an error or do something else
}
RpcEndExcept
Il problema con questo gestore è che rileva tutti gli errori, inclusi gli errori nel programma client. L'intercettazione degli errori nel programma client rende più difficile il debug. Il modo corretto per strutturare un gestore di eccezioni è il seguente:
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
Questo gestore eccezioni ha il vantaggio di consentire a un determinato intervallo di errori. Questi errori non verranno mai restituiti dal server, perché indicano un problema sul lato client.
Inoltre, è consigliabile usare gli attributi [strict_context_handle] e [type_strict_context_handle] per garantire che il runtime RPC crei un handle di contesto in un'interfaccia che può essere passata come argomento solo ai metodi di tale interfaccia. In questo modo si evitano errori del server che si verificano quando gli handle di contesto vengono aperti e passati tra interfacce diverse presenti all'interno dello stesso processo.
Argomenti correlati