Já jsem narazil na několik problémů, s errory si hraju už dost dlouho a tak jsem vymyslel tohle...
<?php /** * Nějaká třída */ class Foo{ /** * Konstruktor, zvláštní tím, že nevrací hodnotu. * @param string */ function Foo($arg){ if(!is_scalar($arg)){ $this = & new Error('...'); return; } } /** * Normální metoda. * @param string */ function doSomething($arg){ if(!is_scalar($arg)){ return new Error('...'); } } } $foo = & new Foo(array('test')); if(isError($foo)){ # Poslat výš, nebo tak něco... } $res = $foo->doSomething(array('bububu')); if(isError($res)){ # Poslat výš, nebo tak něco... } ?>
Tohle je sice funkční, ale sémanticky zatraceně blbá metoda. Předefinovat this je hodno blbce jako já .-). A navíc to nefunguje v PHP/5. Omlouvám se za délku příspěvku, jdu ukázat další, pěknější metodu...
<?php /** * Nějaká třída */ class Foo{ /** * Konstruktor, zvláštní tím, že nevrací hodnotu. * * @param string * Chybová proměnná. * @param string */ function Foo(&$e, $arg){ if($e) return; if(!is_scalar($arg)){ $e .= __FILE__ . '->Foo(): Expected string, ' . gettype($arg) . ' passed.'; return; } } /** * Normální metoda. * @param string * Chybová proměnná. * @param string */ function doSomething(&$e, $arg){ if($e) return; if(!is_scalar($arg)){ $e .= __FILE__ . '->doSomething(): Expected string, ' . gettype($arg) . ' passed.'; return; } } } $e = ''; $foo = & new Foo($e, array('test')); $res = $foo->doSomething($e, array('bububu')); if($e){ die($e); } ?>
Tahle metoda je poměrně spolehlivá. Má také své mouchy. Dá se poměrně slušně vylepšit stopováním pomocí debug_backtrace(). Co se týče odchytu PHP chyb, doporučuji definovat pomocí php funkce set_error_handler() nastavit vlastní funkci na výpis chyb a ty v ostrém provozu raději logovat, než posílat na klienta.
Ještě jednou se omlouvám za délku příspěvku. Jo a mimochodem, autor nepíše tak mizerně, rozhodně ne pro úplné začátečníky...
PS: Rád kdykoliv poradím... stačí napsat; mordae@mordae.net