Členění výjimek v PHP

| Programování

Než začneme hlouběji se zabývat systémem výjimek, je třeba si říct co výjimka znamená.

Výjimka je výjimečná situace, ke které dochází během provádění programu.“

Strom výjimek

LogicException - chyba při návrhu programu; výjimka by měla vést k opravě programu

BadFunctionCallException - nedefinovaná / neexistující funkce

BadMethodCallException - nedefinovaná / neexistující metoda

DomainException - hodnota nespadá do rozsahu hodnoty (enum)

InvalidArgumentException - chybný argument - místo string posláno array

LengthException - překročení povolné délky

OutOfRangeException - volání v případě neexistujícího indexu; tyto chyby by měli být detekovány před zpracováním pole

RuntimeException - zjistitelné pouze za běhu programu

OutOfBoundsException - index mimo rozsah; neexistující index

OverflowException - přetečení bufferu

UnderflowException - podtečení bufferu

RangeException - hodnota není v požadovaném indexu

UnexpectedValueException - neočekávaná chyba

LogicException vs. RuntimeException

LogicException je speciální v tom, že těmto výjímkám lze předejít správným návrhem programu. V případě knihoven poté dochází ke špatné implementaci funkce nebo argumentů. Například výjimku InvalidArgumentException vyvoláme v případě, když funkce přijímá jiné parametry než by měla.

<?php

/**
 * @var string $message Best message under the sun
 * @throws InvalidArgumentException
 */
function myBestFunction($message)
{
    if (!is_string($message)) {
        throw new \InvalidArgumentException('The message must be string');
    }
}

Pokud se budeme bavit o RuntimeException tedy výjimkách zjistitelných pouze za běhu programu, tak v těchto případech nelze předem tuto chybu předpovědět. Jejich příkladem může být atomická operace u souborů kdy dojde k uzamčení souboru jelikož s tímto souborem pracuje již jiný uživatel. V případě že další uživatel bude chtít k tomuto souboru přistoupit, dojde vyvolání k chyby.

Exception message !== User message

Zprávy které píšete do výjímek nejsou určeny pro uživatelé. Jsou určeny buď pro ladění a nebo do logu. Tyto zprávy tedy pište tak, abyste identifikovali problém který nastal.

Ale opravdu nikdy, tyto chyby nezobrazujte uživateli. Pro ně připravte speciální hlášky které pochopí. Ne každý uživatel je hned programátor.