 
 
 
 
 
 
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!
 
 
 
 
 
