Příklad PHP Try Catch: Výukový program pro zpracování výjimek a chyb
Co je to výjimka?
Chyba je neočekávaný výsledek programu, který nemůže zpracovat samotný program.
Chyby jsou vyřešeny opravou programu. Příkladem chyby může být nekonečná smyčka, která se nikdy nepřestane vykonávat.
Výjimkou je neočekávaný výsledek programu, který zvládne program sám.
Mezi příklady výjimek patří pokus o otevření souboru, který neexistuje.
Tuto výjimku lze vyřešit vytvořením souboru nebo poskytnutím možnosti uživateli soubor vyhledat.
Proč řešit výjimku?
- Vyhněte se neočekávaným výsledkům na našich stránkách, které mohou být pro naše koncové uživatele velmi nepříjemné nebo dráždivé
- Zlepšete zabezpečení našich aplikací tím, že nebudeme odhalovat informace, které mohou uživatelé se zlými úmysly použít k útoku na naše aplikace
- Výjimky Php se používají ke změně normálního toku programu, pokud dojde k jakékoli předvídatelné chybě.
Zpracování chyb PHP
Když dojde k chybě, v závislosti na nastavení konfigurace PHP zobrazí chybovou zprávu ve webovém prohlížeči s informacemi týkajícími se chyby, ke které došlo.
PHP nabízí řadu způsobů, jak ošetřit chyby.
Podíváme se na tři (3) běžně používané metody;
- Zemřít prohlášení– funkce matrice kombinuje funkci echo a exit v jednom. Je to velmi užitečné, když chceme vypsat zprávu a zastavit provádění skriptu, když dojde k chybě.
- Vlastní obslužné rutiny chyb – jedná se o uživatelem definované funkce, které jsou volány vždy, když dojde k chybě.
- Hlášení chyb PHP – chybová zpráva v závislosti na nastavení hlášení chyb PHP. Tato metoda je velmi užitečná ve vývojovém prostředí, když nemáte ponětí, co způsobilo chybu. Zobrazené informace vám mohou pomoci při ladění vaší aplikace.
Chyba při zpracování příkladů
Podívejme se nyní na několik jednoduchých příkladů s rutinami pro zpracování chyb.
Předpokládejme, že jsme vyvinuli aplikaci, která používá k ukládání dat textové soubory. Možná budeme chtít zkontrolovat existenci souboru, než se z něj pokusíme číst data.
Níže uvedený kód implementuje výše uvedený příklad.
<?php $denominator = 0; echo 2 / $denominator; ?>
Za předpokladu, že jste uložili soubor simple_error.php do složky phptuts, otevřete URL http://localhost/phptuts/simple_error.php
Získáte následující výsledky
Jak můžete vidět z výše uvedených výsledků, naše aplikace vypadá neprofesionálně a může být pro uživatele obtěžující.
Výše uvedený kód upravíme a pro aplikaci napíšeme obsluhu chyb
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Za předpokladu, že jste výše uvedený kód uložili jako error_handling.php, otevřete adresu URL http://localhost/phptuts/error_handling.php
Poznámka: je dobrým bezpečnostním postupem zobrazit zprávu jako výše uvedenou namísto zprávy jako „Soubor nenalezen“.
Podívejme se na další příklad, který používá vlastní obslužnou rutinu chyb.
Vlastní obslužný program chyb bude nastaven jako výchozí funkce zpracování chyb PHP a v podstatě zobrazí číslo chyby a zprávu.
Níže uvedený kód ilustruje implementaci výše uvedeného příkladu
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Otevřete adresu URL http://localhost/phptuts/custom_error_handler.php získáte následující výsledky
Jak můžete vidět z výše uvedeného příkladu, vlastní obslužné rutiny chyb jsou výkonné v tom smyslu
- Umožňují nám přizpůsobit chybové zprávy.
- Vlastní obsluha chyb může také zahrnovat protokolování chyb do souboru/databáze, zasílání e-mailů vývojáři atd.
Podívejme se nyní na třetí typ zpracování chyb. Budeme používat PHP zabudovanou funkci error_reporting. Má následující základní syntaxi
<?php error_reporting($reporting_level); ?>
TADY,
- „error_reporting“ je funkce hlášení chyb PHP
- „$reporting_level“ je volitelný a lze ho použít k nastavení úrovně hlášení. Pokud nebyla zadána žádná úroveň hlášení, PHP použije výchozí úroveň hlášení chyb, jak je uvedeno v souboru php.ini.
Úroveň hlášení | Description | Příklad |
---|---|---|
E_VAROVÁNÍ | Zobrazuje pouze varovné zprávy. Nezastaví provádění skriptu | error_reporting(E_WARNING); |
E_NOTICE | Zobrazuje upozornění, která se mohou objevit během normálního provádění programu nebo mohou být chybou. | error_reporting(E_ NOTICE); |
E_USER_ERROR | Zobrazuje chyby generované uživateli, např. vlastní obslužný program chyb | error_reporting(E_ USER_ERROR); |
E_USER_WARNING | Zobrazuje uživatelem generované varovné zprávy | error_reporting(E_USER_WARNING); |
E_USER_NOTICE | Zobrazuje upozornění generovaná uživateli | error_reporting(E_USER_NOTICE); |
E_RECOVERABLE_ERROR | Zobrazí chybu, která není závažná a lze ji zpracovat pomocí vlastních obslužných rutin chyb | error_reporting(E_RECOVERABLE_ERROR); |
E_ALL | Zobrazí všechny chyby a varování | error_reporting(E_ ALL); |
Rozdíl mezi chybami a výjimkami
- Výjimky jsou vyvolány a jsou určeny k zachycení, zatímco chyby jsou obecně neodstranitelné.
- Výjimky jsou zpracovávány objektově orientovaným způsobem. To znamená, když je vyvolána výjimka; je vytvořen objekt výjimky, který obsahuje podrobnosti o výjimce.
Níže uvedená tabulka ukazuje metody objektu výjimky
Metoda | Description | Příklad |
---|---|---|
getMessage() | Zobrazí zprávu výjimky |
<?php echo $e->getMessage(); ?> |
získat kód() | Zobrazuje číselný kód, který představuje výjimku |
<?php echo $e->getCode(); ?> |
getFile() | Zobrazuje název souboru a cestu, kde došlo k výjimce |
<?php echo $e->getFile(); ?> |
getLine() | Zobrazuje číslo řádku, kde došlo k výjimce |
<?php echo $e->getLine(); ?> |
getTrace() | Zobrazí pole zpětného sledování před výjimkou |
<?php print_r( $e->getTrace()); ?> |
getPrevious() | Zobrazí předchozí výjimku před aktuální |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | Zobrazí backtrace výjimky jako řetězec namísto pole |
<?php echo $e->getTraceAsString(); ?> |
__toString() | Zobrazí celou výjimku jako řetězec |
<?php echo $e->__toString(); ?> |
Níže je uvedena základní syntaxe pro vyvolání výjimky.
<?php throw new Exception("This is an exception example"); ?>
TADY,
- „throw“ je klíčové slovo používané k vyvolání výjimky
- „new Exception(…)“ vytvoří objekt výjimky a předá řetězec „Toto je příklad výjimky“ jako parametr zprávy.
Výše uvedený kód zobrazí následující zprávu.
Nyní se podíváme na příklad, který implementuje výjimky throw a catch.
Výše uvedený příklad upravíme a zahrneme do něj pokusy, házení a chycení.
Má následující základní syntaxi.
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
TADY,
- „try{…}“ je blok kódu, který se má provést a který by mohl potenciálně vyvolat výjimku
- “catch(Exception $e){…}” je blok kódu, který zachytí vyvolanou výjimku a přiřadí objekt výjimky proměnné $e.
Níže uvedený kód ukazuje příklad základní výjimky s implementovanou výjimkou try, throw a catch.
Program schválně vyvolá výjimku, kterou pak zachytí.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
Otevřete adresu URL http://localhost/phptuts/exception_handling.php Získáte následující výsledky.
Je také možné vytvořit více výjimek pro jeden příkaz php try v závislosti na typu vyvolané výjimky.
Viz článek na MySQL, PHP data access… pro příklady implementace více výjimek
Více výjimek
Vícenásobná výjimka používá více bloků try catch ke zpracování vyvolaných výjimek. Vícenásobné výjimky jsou užitečné, když;
- Chcete zobrazit přizpůsobenou zprávu v závislosti na vyvolané výjimce
- Chcete provést jedinečnou operaci v závislosti na vyvolané výjimce
Níže uvedený vývojový diagram ukazuje, jak funguje více výjimek
Podívejme se na příklad, který používá více výjimek.
Upravíme kód, který dělí číslo zadaným jmenovatelem.
Očekáváme výskyt dvou typů výjimek;
- Dělení nulou
- Dělení záporným číslem
Pro jednoduchost budeme v našich catch blocích zobrazovat pouze typ výjimky.
PHP vestavěná třída Exception se používá k vyvolání výjimek.
Vytvoříme dvě třídy, které rozšíří třídu výjimek a použijí je k vyvolání výjimek.
Níže uvedený kód ukazuje implementaci.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
Testování kódu
Budeme předpokládat, že jste uložili multiple_exceptions.php do složky phptuts.
Přejděte na adresu URL http://localhost/phptuts/multiple_exceptions.php
Přepněte zpět do souboru PHP a předejte -1 jako parametr, jak je znázorněno na následujícím diagramu.
Přejděte na adresu URL http://localhost/phptuts/multiple_exceptions.php.
Jaké výsledky získáváte? Předejte 3 jako parametr.
Jaké výsledky získáváte?
Shrnutí
- Chyby jsou neočekávané výsledky vytvořené kódem PHP
- Zpracování chyb zlepšuje výkon aplikace
- PHP má vestavěné funkce, které lze použít k přizpůsobení způsobu, jakým PHP hlásí chyby
- Výjimky jsou jako chyby, ale mohou být zachyceny pomocí bloku catch při hození.
- Zobrazování chybových zpráv, které zobrazují informace o chybě, je považováno za špatný postup zabezpečení.