Znam da se ovo tiče coding style-a, ali me zanima šta ostali učesnici foruma misle. Kao što verovatno većina vas zna, u PHP5 je (će biti) prisutan interfejs za izuzetke (exceptions).

Ono što mene sada zanima jeste kada je poželjno koristiti ih? Njihovo izvršavanje je nešto malo sporije od klasičnih promena toka programa pomoću if/else i sličnih jezičkih konstrukcija. Takođe, moguće je čak i u PHP-u napravti memory leak preko istih.

Sam izuzetak u PHP-u predstavlja objekat tako da može imati sve i svja od dodatnih informacija kao što su delovi backtrace-a.

Moje je mišljenje da izuzecima treba kontrolisati greške koje nastaju usled obrade korisničkih parametara ili trenutnih grešaka u pristupu resursima, dok greške u kodu treba obrađivati kroz standardni trigger_error/error handler mehanizam. Pod greškama u kodu ne mislim samo na greške u kodu sistema jer toga ne bi trebalo biti već i na greške u čitanju i izvršavanju pojedinih modula, pristupu šablonima koji se pozivaju iz programa/modula i slično...

Takođe zanimali bi me i predlozi mojih cenjenih čitalaca ;) o mogućnostima implementacije exceptions mehanizma u PHP4. Trebalo bi napraviti globalno drvo koje bi čuvalo podatke o izuzecima i prostor za jedan serijalizovani niz u kome bi se mogli sačuvati dodatni podaci ukoliko postoji potreba za tim. Dalje, potrebna je funkcija trow_exception koja bi postavljala status izuzetka na 1, kao i svih čvorova drveta od njega do vrha. Funkcija catch_exception bi proveravala da li je status 1, i ako jeste postavljala status od tog čvora naniže na 0 i vraćala TRUE, odnosno FALSE ako status nije 1. If konstrukcija oko catch_exception poziva bi imitirala try/catch konstrukciju u petici.

I šta je onda problem? Pa problem je to što se onda ceo kod mora pisati odvojeno za verzije 4/5. Ovo nije nikakav problem za sistemske klase jer se one dosta menjaju inače (naročito one za rad sa modulima/objektima). Problem je šta u samim modulima gde bi se po mom viđenju izuzetaka oni mnogo više i koristili jer će većina grešaka u sistemskim klasama biti obrađena kroz klasičan error handler. Ono što bi bilo zgodno jeste pisanje nekog omotača za izuzetke koji u petici koristi njene jezičke kontrukcije, dok u četvorci koristi predloženu implementaciju. To je sa nekoliko eval-a koji su samo jedno slovo daleko od evil moguće za registrovanje izuzetaka i za bacanje istih, ali ja ne vidim način da to primenim na try/catch konstrukciju, tj. morao bi ceo try blok da bude pod eval-om, što je poprilično glupo jer komplikuje klasičan error handler dodavajući dodatne elemente u backtrace i verovatno (nisam testirao) dosta usporava rad. Rešenje koje mi sada pada na pamet bi ličilo na:

...
if(($sfw_phpversion & SFW_PHP4)) {

  /* catch exception in PHP4 style via catch_exception function call */
  $this->add_code($code);
  if( catch_exception('ExcAddCompCode') ) {
	...
	...
  }

}
else {

  /* catch exception in PHP5 style */
  try {
	$this->add_code($code);
  }
  catch(ExcAddCompCode $e) {
	...
	...
  }

}


Ovo dodaje jako puno koda na inače nevoljno pisanu kontrolu grešaka i mora da postoji neko rešenje. Jedno je trivijalno, ne obrađivati PHP5 deo već zarad backward kompatibilnosti raditi samo na prvi način. Ono što se žrtvuje tako jesu neke napredne mogućnosti grupisanja/ponovnog bacanja/šta ti ja znam izuzetaka, a što bi ako bi se primenila gornja implementacija moglo uraditi u onom PHP5 specific delu koda. A možda treba potpuno zaboraviti na sve ovo i koristiti

Odakle inače sada ovo? Radim sada na svom PHP framework-u (konverzija na PHP5, promena rada sa modulima/objektima, podrška za distribuirane objekte itd) i eto, priča o kontrolisanju grešaka je izbila ovih dana u prvi plan. Željno očekujem predloge onih koji se igraju duže vreme sa peticom od mene ili su izuzetke susretali u drugim jezicima...