Usein ongelmaa voidaan kiertää siten, että kukin aliohjelma tehdään funktioksi, joka palauttaa 0 jos aliohjelma pystyttiin toteuttamaan virheettömästi ja nollasta eroavan virhekoodin jos jokin virhe havaittiin.
int laske(...)
{
if ( homma1_pielessa ) return 1;
... onnistuneita hommia ...
if ( homma2_pielessa ) return 2;
... onnistuneita hommia ...
return 0;
}
Tällöin virheen käsittelyvastuu jää kutsuvalle
ohjelmalle:
joko siirretään vastuu edelleen kutsujalle: if ( ( ret = laske(...) ) ) return ret; ... tai yritetään toipua virheestä tai kaadetaan koko ohjelma: assert(laske(...));Ohjelman kaatamista ei voida pitää hyvänä vaihtoehtona muulloin kuin pienissä testiohjelmissa.
Lisäongelma tulee usein vielä purkua vaativista rakenteista (varattu muisti, avonaiset tiedostot). Usein goto-lauseen käyttö antaa ainoan kohtuullisen siistin ratkaisun:
int laske(...)
{
int ret = 1;
...varaa_1...
if ( homma1_pielessa ) goto pura_1;
ret = 2;
... onnistuneita hommia ...
...varaa_2...
if ( homma2_pielessa ) goto pura_2;
... onnistuneita hommia ...
ret = 0;
pura_2:
... pura_2 ...
pura_1:
... pura_1 ...
return ret;
}
Joskus voidaan jopa joutua turvautumaan longjumpiin!