V čem spočívá zpracování chyb a výjimek v PHP?
sobes.tech AI
Odpověď od AI
Zpracování chyb a výjimek v PHP umožňuje řídit provádění programu při vzniku nesprávných situací, předcházet fatálním selháním a poskytovat smysluplné informace uživateli.
Chyby
Chyby jsou problémy, které nastávají na úrovni interpretu PHP. Mohou být syntaktické, logické nebo vzniknout při přístupu k neexistujícím zdrojům. Úrovně chyb jsou určeny konstantami (E_ERROR, E_WARNING, E_NOTICE atd.) a mohou být nakonfigurovány pomocí error_reporting a display_errors.
Pro zpracování chyb se používají vlastní funkce-řešitelé, které se registrují pomocí set_error_handler(). Tato funkce zachytí chyby (kromě E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING), umožňuje je zaznamenat, zobrazit zprávu, zastavit běh skriptu nebo jej pokračovat.
<?php
// Vlastní funkce pro zpracování chyb
function myErrorHandler($errno, $errstr, $errfile, $errline) {
// Logování chyby
error_log("Chyba [$errno]: $errstr v souboru $errfile na řádku $errline");
// Zobrazení zprávy uživateli (podle prostředí)
if (ini_get('display_errors')) {
echo "Došlo k chybě: [$errno] $errstr<br>";
echo "V souboru: $errfile na řádku: $errline<br>";
}
// Ukončení skriptu při kritických chybách
if ($errno == E_USER_ERROR) {
die("Kritická chyba. Skript byl ukončen.");
}
// Pokračovat ve standardním zpracování PHP, pokud funkce vrátí false
// return false;
}
// Registrace funkce-řešitele
set_error_handler("myErrorHandler");
// Příklad chyby
// echo $undeclaredVar; // Vyvolá E_NOTICE
Výjimky
Výjimky jsou objekty, které jsou vyhazovány při výjimečných situacích. Umožňují strukturovat kód a řídit tok provádění flexibilněji než tradiční zpracování chyb.
Výjimky jsou zpracovávány pomocí konstrukce try...catch...finally:
try: Blok kódu, ve kterém může dojít k výjimce.catch: Blok kódu, který se vykoná, pokud došlo k výjimce vtrynebo jinémcatch. Lze použít vícecatchbloků pro různé typy výjimek.finally: (dostupné od PHP 5.5) Blok kódu, který se vykoná vždy, bez ohledu na to, zda došlo k výjimce nebo ne.
<?php
function divide($a, $b) {
if ($b === 0) {
// Vyhození výjimky vestavěné třídy Exception
throw new Exception("Dělení nulou není možné.");
}
return $a / $b;
}
try {
// Pokus o provedení kódu, který může vyvolat výjimku
echo divide(10, 2) . "<br>";
echo divide(5, 0) . "<br>"; // zde bude generována výjimka
echo "Tento kód nebude vykonán, pokud předchozí řádek vyvolal výjimku.";
} catch (Exception $e) {
// Zachycení výjimky
echo "Zachycena výjimka: " . $e->getMessage() . "<br>";
// Lze také získat soubor, řádek a zásobník volání
// echo "V souboru: " . $e->getFile() . " na řádku: " . $e->getLine() . "<br>";
// echo "Zásobník volání: " . $e->getTraceAsString() . "</pre>";
} finally {
// Tento blok se vykoná vždy
echo "Operace dokončena.<br>";
}
Třídy výjimek
PHP poskytuje základní třídu Exception, od které dědí další vestavěné třídy výjimek (například InvalidArgumentException, RuntimeException). Je možné vytvářet vlastní třídy výjimek, děděním od Exception nebo jeho potomků, pro přesnější reprezentaci typů chyb.
<?php
class MyCustomException extends Exception {
// Lze přidat vlastní vlastnosti a metody
}
function processData($data) {
if (empty($data)) {
// Vyhození vlastní výjimky
throw new MyCustomException("Chybí data k zpracování.");
}
// ... zpracování dat
}
try {
processData([]);
} catch (MyCustomException $e) {
echo "Zachycena vlastní výjimka: " . $e->getMessage() . "<br>";
} catch (Exception $e) {
echo "Zachycena jiná výjimka: " . $e->getMessage() . "<br>";
}
Obecné zásady
- Nezachytávejte chyby, které nemůžete zpracovat. Pokud nevíte, jak správně reagovat na konkrétní chybu, nechte ji, aby se vynořila výše.
- Výjimky jsou vhodnější pro očekávané, ale výjimečné situace (například chyba vstupu uživatele, nemožnost připojení k DB). Chyby často poukazují na problémy v kódu nebo prostředí.
- Logujte chyby a výjimky. To je klíčové pro ladění a monitorování aplikace.
- Neodhalujte citlivé informace uživateli v hlášeních o chybách.
- Používejte
set_exception_handler()pro zpracování nezachycených výjimek. To zabrání fatálním chybám a umožní graceful degradation.
<?php
// Zpracovatel nezachycených výjimek
function myExceptionHandler($exception) {
error_log("Nezachycená výjimka: " . $exception->getMessage());
// Přesměrování na chybovou stránku, zobrazení obecné zprávy apod.
echo "Na serveru došlo k neočekávané chybě. Zkuste to později.";
}
set_exception_handler('myExceptionHandler');
// Tento kód vyhodí výjimku, která bude zachycena myExceptionHandler
// throw new Exception("Toto je nezachycená výjimka.");
Tímto je správné použití mechanismů zpracování chyb a výjimek základní součástí tvorby spolehlivých a udržovatelných PHP aplikací.