Výjimky a ošetřování chyb v PHP Who is General Failure and why is he reading my disk?!
Koncept výjimek Výjimky fungují jako v jiných jazycích. Výjimka je objekt třídy Exception (nebo třídy odvozené). Výjimky se vrhají a chytají. Pomocí výjimek lze oznamovat chyby i z míst, odkud by to bylo jinak obtížné. Např. při hlubokém zanoření a složité hierarchii funkcí. Pozor na Neodchycená výjimka způsobí fatal error. Destruktory nesmí házet výjimky. Vrhání a chytání výjimek není příliš rychlé. verze 1.1 2008-2009, Martin Kruliš 2
Chytání výjimek Výjimky se chytají pomocí try-catch bloků. První vyhovující catch blok výjimku odchytí. Výběr catch bloku se provádí podle typu výjimky. try {... kod... } catch (MyException $e) {... osetreni moji vyjimky... } catch (Exception $e) {... osetreni obecne vyjimky... } verze 1.1 2008-2009, Martin Kruliš 3
Házení výjimek Výjimky se hází příkazem throw. throw new Exception('Error '); Throw může být použito i uvnitř catch bloku, aby výjimku znovu hodilo (nebo hodilo jinou výjimku). try {... } catch(myexception $e) {... castecne osetreni vyjimky... throw $e; } verze 1.1 2008-2009, Martin Kruliš 4
Tvorba tříd výjimek Každá třída výjimek musí být odvozena od Exception. Odvozené třídy nemusí předefinovat žádné metody. Pokud předefinuje konstruktor, je povinen zavolat konstruktor předka (resp. třídy Exception). Je vhodné předefinovat metodu tostring(), která se používá k výpisu výjimky. Nové třídy nevytvářejte zbytečně. Když potřebujete rozlišit jiný typ chyby. Když potřebujete do těla výjimky uložit další data (kromě chybové zprávy). verze 1.1 2008-2009, Martin Kruliš 5
Ošetřování chyb v PHP Interní chyby by se neměly zobrazovat uživateli. Uživatel neví co chyba znamená (zbytečně matoucí). Případně to může způsobit narušení bezpečnosti. Chyby je potřeba uložit někam, kde si je může přečíst programátor. PHP má operátor řízení chyb - @. Je-li předřazen nějakému výrazu, chyby v tomto výrazu budou ignorovány. Není příliš praktický, ale pro lokální řešení se hodí. $data = @file('data_file.txt') or die('error '); verze 1.1 2008-2009, Martin Kruliš 6
Chyby v PHP Chyby mají různou úroveň. Úrovně definují závažnost chyby. Např: E_ERROR Fatální chyby, které ukončí běh skriptu. E_WARNING Těžké chyby, ze kterých je možné se zotavit. E_NOTICE Neobvyklé situace (možná chyba). E_USER_NOTICE Ladící výpis. E_STRICT Oznámení PHP. Návrh na změnu v kódu apod. Je možné nastavit, které chyby se mají oznamovat a které ne. Globální nastavení je v php.ini. Lokálně je upravuje funkce error_reporting(). Uživatelské chyby lze uměle vyvolat trigger_error(). verze 1.1 2008-2009, Martin Kruliš 7
Funkce pro obsluhu chyb Chyby se dají ošetřit vlastními funkcemi. set_error_handler() nastaví callback funkci, která se použije pro ošetření libovolné chyby v PHP Handler dostane k dispozici úroveň chyby, její text a pozici ve skriptu. Pokud vrátí false, zavolá se ještě výchozí obsluha chyb. Výchozí obsluha vypíše chybu na výstup (případně ukončí skript). Výchozí obsluha se chová podle nastavené úrovně výpisu. set_exception_handler() nastaví callback funkci, která ošetřuje neodchycené výjimky Funguje obdobně jako odchytávání chyb. restore_error_handler() nastaví předchozí obsluhu chyb (před zavoláním set_error_handler()) restore_exception_handler() analogie pro obsluhu výjimek verze 1.1 2008-2009, Martin Kruliš 8
Vypisování a logování chyb Detailní informace o chybě. Občas nestačí poloha ve zdrojovém kódu, ale potřebujeme podrobnější informace - backtrace. Funkce debug_backtrace() vrací aktuální stav PHP zásobníku. Seznam volání funkcí, jejich argumenty Analogicky debug_print_backtrace() rovnou obsah zásobníku vypíše na výstup ve vhodném formátu. PHP podporuje i přímé logování chyb. Funkce error_log() posílá zprávu do logovacího systému. Logovací systém může zprávu zapsat do logu web. serveru, poslat zprávu přes TCP spojení, přes email, nebo ji zapsat do souboru. Příklad verze 1.1 2008-2009, Martin Kruliš 9