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!