PHP Спадкування винятків

Визначений користувачем клас виключення повинен бути визначений як клас розширювальний (успадкований) вбудований клас Exception. Нижче наведено методи та властивості класу Exception, доступні дочірнім класам.

Приклад #1 Вбудований клас Exception

class Exception extends Throwable protected $message = 'Unknown exception' ; // повідомлення про виключення private $string; // властивість для __toString protected $code = 0; // Користувальницький код вилучення protected $file; // файл, у якому було викинуто виняток protected $line; // рядок, в якому було викинуто виняток private $trace; // трасування викликів методів та функцій private $previous; // Попередній виняток, якщо виняток вкладений

public function __construct ( $message = null , $code = 0 , Exception $previous = null );

final private function __clone(); // забороняє клонування виключення

final public function getMessage(); // повідомлення виключення final public function getCode(); // код виключення final public function getFile(); // файл, де викинуто виняток final public function getLine(); // рядок, на якому викинуто виняток final public function getTrace(); // масив backtrace() final public function getPrevious(); // виключення final public function getTraceAsString (); // відформатований рядок трасування

// Перевизначуваний public function __toString (); // відформатований рядок для відображення > ?>

Якщо клас, успадкований від Exception перевизначає конструктор, необхідно викликати у конструкторі parent::__construct(), щоб бути впевненим, що всі доступні дані були правильно присвоєні. Метод __toString() може бути перевизначений, щобзабезпечити потрібний висновок, коли об'єкт перетворюється на рядок.

Винятки не можна клонувати. Спроба клонувати виняток призведе до непоправної помилкиE_ERROR.

Приклад #2 Спадкування класу Exception (PHP 5.3.0+)

/** * Визначимо свій клас виключення */ class MyException extends Exception // Перевизначимо виняток так, що параметр message стане обов'язковим public function __construct ( $message , $code = 0, Exception $previous = null) // деякий код

// переконайтеся, що всі параметри, що передаються, вірні parent :: __construct ( $message , $code , $previous ); >

// Перевизначимо рядкове уявлення об'єкта. public function __toString () return __CLASS__ . ": [ < $this ->code > ]: < $this ->message > \n" ; >

public function customFunction() echo "Ми можемо визначати нові методи у спадковому класі\n" ; > >

/** * Створимо клас для тестування винятку */ class TestException public $var ;

const THROW_NONE = 0; const THROW_CUSTOM = 1; const THROW_DEFAULT = 2;

function __construct ( $avalue = self :: THROW_NONE )

switch ($avalue) case self :: THROW_CUSTOM : // Викидаємо власний виняток throw new MyException ('1 - неправильний параметр', 5); break;

case self :: THROW_DEFAULT : // Викидаємо вбудований виняток throw new Exception ( '2 - неприпустимий параметр', 6); break;

default: // Жодних винятків, об'єкт буде створено. $this -> var = $avalue; break; > > >

// Приклад 1 try $o = новий TestException ( TestException :: THROW_CUSTOM ); > catch (MyException $e) < // Будеперехоплено echo "Впіймано власний перевизначений виняток\n" , $e ; $e -> customFunction (); > catch (Exception $e) < //Буде пропущено echo "Піймано вбудований виняток\n" , $e ; >

// Звідси буде продовжено виконання програми var_dump ($o); // Null echo "\n\n";

// Приклад 2 try $o = новий TestException ( TestException :: THROW_DEFAULT ); > catch (MyException $e) < // Тип виключення не збігається echo "Піймано перевизначений виняток\n" , $ e; $e -> customFunction (); > catch (Exception $e) < // Буде перехоплено echo "Перехоплено вбудований виняток\n" , $e ; >

// Звідси буде продовжено виконання програми var_dump ($o); // Null echo "\n\n";

// Приклад 3 try $o = New TestException ( TestException :: THROW_CUSTOM ); > catch (Exception $e) < // Буде перехоплено echo "Піймано вбудований виняток\n" , $e ; >

// Продовження виконання програми var_dump ($ o); // Null echo "\n\n";

// Приклад 4 try $o = New TestException (); > catch (Exception $e) < // Буде пропущено, т.к. виняток не викидається echo "Впійманий вбудований виняток\n" , $e ; >

// Продовження виконання програми var_dump ($ o); // TestException echo "\n\n"; ?>

PHP 5 до версії 5.3.0 не підтримує вкладені винятки. Якщо є необхідність запустити наведений вище приклад у зазначених версіях PHP, то потрібно замінити клас MyException.

/** * Визначимо свій клас виключення */ class MyException extends Exception // Перевизначимо виняток так, що параметр message стане обов'язковим public function __construct ( $message , $code = 0) // деякийкод

// переконайтеся, що всі параметри, що передаються, вірні parent :: __construct ( $message , $code ); >

// Перевизначимо рядкове уявлення об'єкта. public function __toString () return __CLASS__ . ": [ < $this ->code > ]: < $this ->message > \n" ; >

public function customFunction() echo "Ми можемо визначати нові методи у спадковому класі\n" ; > > ?>