Condividi tramite


Indicare errori in base alle eccezioni

Per i programmatori C tradizionali, gli errori vengono comunemente restituiti tramite valori restituiti o un parametro speciale [out] che restituisce il codice di errore. Ciò comporta l'implementazione delle interfacce nel modo seguente:

long sample(...)
{
    ...
    p = new Cbar(...);
    if (p == NULL)
    {
        // cleanup
        ...
        return ERROR_OUTOFMEMORY;
    }
}

Il problema con questo approccio è che i valori restituiti RPC sono semplicemente numeri interi lunghi. Non hanno alcun significato speciale come errori (si noti che error_status_t non ha semantica speciale sul lato server), che comporta implicazioni importanti.

In primo luogo, RPC non viene avvisato che l'operazione non è riuscita; tenta di annullare il matrimonio di tutti gli argomenti [in, out] e [out]. Anche la semantica di errore degli handle di contesto è diversa. Il pacchetto restituito al client è essenzialmente un pacchetto di operazione riuscita, con il codice di errore nascosto nel pacchetto. Ciò significa anche che RPC non usa informazioni di errore estese, quindi il software client spesso non è in grado di distinguere dove la chiamata non è riuscita.

Per indicare gli errori nelle routine del server RPC, generare eccezioni SEH (Structured Exception Handling) (non C++) è un approccio molto migliore. Quando viene generata un'eccezione SEH, il controllo passa direttamente al runtime RPC. A volte si verifica un errore profondo in una routine che non può eseguire correttamente la pulizia e deve indicare un errore al chiamante. La routine deve restituire un errore al chiamante, che a sua volta può restituire un errore al chiamante e così via. Tuttavia, l'ultima routine del server nello stack deve generare un'eccezione prima di tornare a RPC per indicare a RPC che si è verificato un errore.

Gestione delle eccezioni