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.