Megosztás a következőn keresztül:


Hibák jelzése kivételek szerint

A hagyományos C programozók esetében a hibák általában visszatérési értékekkel vagy egy speciális [out] paraméterrel jelennek meg, amely a hibakódot adja vissza. Ez a következő módon implementált felületekhez vezet:

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

Ezzel a megközelítéssel az a probléma, hogy az RPC visszatérési értékei egyszerűen hosszú egész számok. A hibáknak nincs különleges jelentésük (vegye figyelembe, hogy error_status_t nem rendelkezik speciális szemantikával a kiszolgáló oldalán), ami fontos következményekkel jár.

Először is, az RPC nem kap értesítést arról, hogy a művelet meghiúsult; megpróbálja feloldani az összes [in, out] és [out] argumentumot. A környezeti leírók hibaszemantikája is eltérő. Az ügyfélnek visszaadott csomag lényegében egy sikeres csomag, a hibakód pedig mélyen a csomagban van eltemetve. Ez azt is jelenti, hogy az RPC nem használ kiterjesztett hibainformációkat, ezért az ügyfélszoftver gyakran nem tudja felismerni, hogy hol meghiúsult a hívás.

Az RPC-kiszolgálói rutinok hibáinak jelzése strukturált kivételkezelési (SEH) kivételekkel (nem C++) sokkal jobb módszer. SEH-kivétel esetén a vezérlés közvetlenül az RPC futási idejére kerül. A hiba néha olyan rutin mélyére fordul, amely nem tud megfelelően megtisztítani, és hibát kell jeleznie a hívójának. A rutinnak hibát kell visszaadnia a hívónak, ami viszont hibát adhat vissza a hívójának, és így tovább. A verem utolsó kiszolgálói rutinjának azonban kivételt kell kivennie, mielőtt visszatér az RPC-be, hogy jelezze az RPC-nek, hogy hiba történt.

kivételkezelési