Prev Next Up Title Contents Index

Virheiden käsittely C- kielen ehdoilla

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!


Prev Next Up Title Contents Index