Condividi tramite


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.

strict_context_handle

type_strict_context_handle