Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W przypadku tradycyjnych programistów języka C błędy są często zwracane przez zwracane wartości lub specjalny parametr [out], który zwraca kod błędu. Prowadzi to do zaimplementowania interfejsów w następujący sposób:
long sample(...)
{
...
p = new Cbar(...);
if (p == NULL)
{
// cleanup
...
return ERROR_OUTOFMEMORY;
}
}
Problem z tym podejściem polega na tym, że zwracane wartości RPC są po prostu długimi liczbami całkowitymi. Nie mają specjalnego znaczenia jako błędy (należy pamiętać, że error_status_t nie ma specjalnych semantyki po stronie serwera), co niesie ze sobą ważne konsekwencje.
Po pierwsze, RPC nie jest powiadamiany, że operacja nie powiodła się; próbuje usunąć wszystkie argumenty [in, out] i [out]. Semantyka błędów dojść kontekstowych jest również inna. Pakiet zwrócony do klienta jest zasadniczo pakietem powodzenia, a kod błędu został głęboko pochowany w pakiecie. Oznacza to również, że RPC nie używa rozszerzonych informacji o błędzie, więc oprogramowanie klienckie często nie może rozpoznać, gdzie wywołanie nie powiodło się.
Wskazywanie błędów w procedurach serwera RPC przez zgłaszanie wyjątków strukturalnych (SEH) wyjątków (a nie C++) jest znacznie lepszym podejściem. Gdy zgłaszany jest wyjątek SEH, kontrolka przechodzi bezpośrednio do czasu wykonywania RPC. Błąd czasami występuje głęboko w procedurze, która nie może prawidłowo oczyścić i musi wskazywać błąd dla jego wywołującego. Rutyna powinna zwrócić błąd do elementu wywołującego, co z kolei może zwrócić błąd do elementu wywołującego i tak dalej. Jednak ostatnia rutyna serwera na stosie powinna zgłosić wyjątek, zanim powróci do RPC, aby wskazać RPC, że wystąpił błąd.
Tematy pokrewne