Udostępnij przez


Wskazuje błędy według wyjątków

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.

obsługi wyjątków