OOP poznámky II - vyjímky - Exception

Vydáno: 20.06.10 Kategorie:

V minulém díle jsem si sepsal naprosté základy OOP v PHP. Dnešní poznámky se vztahují k zachycování a práci s výjimkami (chybami) v PHP.

Základní pojmy Exception

throw new Exception($message, $errorno) – zaregistruj novou výjimku (s textem $message, a číslem chyby $errorno)

try {
        ....
}

Blok kódu, ve kterém se hledá zaregistrovaná výjimka.

catch(Exception $e) {
        echo "Tady bude výpis výjimky:" . $e;
}

Za try blokem následuje catch blok, který slouží k zachycení výjimky.

Vlastní výjimka – poděděná z Exception

class MySQLException extends Exception {
  //žádná vlastní data, všechny poděděné od Exception

  public function __construct($message, $errorno) {
      //pokud je číslo chyby větší než 5000, pak to je chyba použití třídy, protože mysql má jen chyby do 5000
      if($errorno >= 5000) {
        $message = __CLASS__ . " - Chyba použití třídy! " . $message;
      }
      else {
        $message = __CLASS__ . " - " . $message;
      }

      //nyní zavolám kontruktor rodiče Exception
      parent::__construct($message, $errorno);
  }

  //kromě konstruktoru mohu v potomkovi změnit i metodu __toString(). Ostatní metody jsou typu final a nemohou být proto v potomkovi přepsány
  public function __toString() {
    return("Error: $this->code - $this->message");
  }

}
try {
        //zde někde může dojít k vyhození výjimky
}
//pokud v bloku try dojde k zaznamenání vyjímky (throw new MySQLExcerption($zprava, $chyba)), pak jí v catch zachyť a zobraz
catch(MySQLException $e)
{
  echo "<h1>".$e."</h1>";
  exit();
}
catch(Exception $e)
{
  echo $e;
  exit();
}

Zachycení výjimky ze třídy (MySQLException) musí být před rodičovskou (Exception), protože jinak by jí zachytil rodič a na potomka by se už nedostalo :D

Více o rodičovské třídě Exception na http://php.net/…xception.php