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" ; > > ?>