Autor Zpráva
Dusann
Profil
catch (Exception $e) => Čo znamená z funkčného hľadiska to slovo pred premennou $e ?

Je to iba nejaký ľubovoľný názov pre pomenovanie catch bloku ktorý sa k ničomu neviaže ?

V PHP dokumentácii som nenašiel nič kde by bola syntax catch bloku popísaná...díky
juriad
Profil
Each try must have at least one corresponding catch block. Multiple catch blocks can be used to catch different classes of exceptions.
[...]
The thrown object must be an instance of the Exception class or a subclass of Exception. Trying to throw an object that is not will result in a PHP Fatal Error.

http://www.php.net/manual/en/language.exceptions.php

# Definuji tři výjimky:
class MyException extends Exception {}
class MyFirstException extends MyException {}
class MySecondException extends MyException {}

try {
  # vyhodím nějakou výjimku
  throw new Exception();
  throw new MyException();
  throw new MyFirstException();
  throw new MySecondException();
} catch (MyFirstException $e) {
  echo "Zachycena chyba typu MyFirstException";
} catch (MySecondException $e) {
  echo "Zachycena chyba typu MySecondException";
} catch (MyException $e) {
  echo "Zachycena chyba typu MyException nebo potomek MyException";
} catch (Exception $e) {
  echo "Zachycena chyba typu Exception nebo potomek Exception";
}
Zkus si zakomentovat vyhazování jednotlivých výjimek, zakomentovat jednotlivé catch bloky a změnit pořadí catch bloků.

Výjimka typu X je zachycena v prvním bloku, který chytá X nebo nějakého předka X.
Tori
Profil
Výjimky jsou normální třídy, které mají za předka Exception nebo jejího potomka. Tohle je požadovaný typ výjimky (= název její třídy), který se má tím blokem catch zachytit. Můžete tak reagovat na různé typy výjimek různým způsobem:

try {
    // .... nějaký kód
} catch (InvalidArgumentException $e) {
    echo "Nějaká funkce dostala nesprávná data: ".$e->getMessage();
} catch (LogicException $e) {
    echo "Někde v logice programu mám nesmysl: ".$e->getMessage();
} catch (Exception $e) { // zachytí všechny ostatní výjimky, protože je předkem všech
    echo "Vyhozena výjimka: ".$e->getMessage();
}
Je to v podstatě totéž jako zápis:
try {
    // ... nějaký kód
} catch (Exception $e) {
    if (get_class($e) === 'InvalidArgumentException')
        echo 'Nesprávná data: ';
    elseif (get_class($e) === 'LogicException')
        echo 'Logická chyba: ';
    else
        echo 'Jiná výjimka: ';
    echo $e->getMessage();
}
Dusann
Profil
Tori:

Díky za prehľadnú a ľahko pochopiteľnú ukážku, teraz už mi je to úplne jasné :)

Ak by takýto zrozumiteľný príklad bol v PHP dokumentácii ani by som tento dotaz nemusel položiť :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: