Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 un significato speciale come errori (si noti che error_status_t non ha una semantica speciale sul lato server), che comporta implicazioni importanti.
In primo luogo, RPC non viene avvisato che l'operazione non è riuscita; tenta di annullare ilmarsaling 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 riuscito, con il codice di errore nascosto nel pacchetto. Questo 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.
L'indicazione degli errori nelle routine del server RPC generando eccezioni SEH (Structured Exception Handling) (non C++) è un approccio molto migliore. Quando viene generata un'eccezione SEH, il controllo passa direttamente al runtime RPC. Un errore a volte si verifica in profondità in una routine che non è in grado di pulire correttamente 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.
Argomenti correlati