Sobes.tech
Junior

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 v try nebo jiném catch. Lze použít více catch bloků 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í.