Потребителски дефиниран клас за изключения може да бъде дефиниран, като се наследи базовия клас за изключения. Членовете и свойствата по-долу показват какво е достъпно в класа наследник, наследяващ базовия клас за изключения.
Example #1 Базов клас за изключения
<?php
class Exception
{
protected $message = 'Неизвестно изключение'; // съобщение на изключението
protected $code = 0; // потребителски дефиниран код на изключението
protected $file; // име на файл с кода на изключението
protected $line; // ред в кода на изключението
function __construct($message = null, $code = 0);
final function getMessage(); // съобщение на изключението
final function getCode(); // код на изключението
final function getFile(); // име на файл с кода
final function getLine(); // ред в кода
final function getTrace(); // масив с backtrace() - обратно проследяване
final function getTraceAsString(); // форматиран низ на проследяването
/* Предифинируем */
function __toString(); // форматиран низ за показване
}
?>
Ако даден клас наследява базовия клас за изключения и повторно дефинира конструктора, е силно препоръчително да се извика също и parent::__construct(), за да се осигури правилното присвояване на всички налични данни. Методът __toString() може да бъде дефиниран повторно, за да се предостави поръчков изход, когато обектът е представен като низ.
Example #2 Наследяване на класа за изключения
<?php
/**
* Поръчково дефиниране на клас за изключения
*/
class MyException extends Exception
{
// Повторно дефиниране на изключението, така че низът да бъде задължителен
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";
}
}
/**
* Създаване на клас за проверка на изключението
*/
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 = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // Ще бъде хванато
echo "Хванато е моето изключение\n", $e;
$e->customFunction();
} catch (Exception $e) { // Skipped
echo "Хванато е изключението по подразбиране\n", $e;
}
// Продължаване на изпълнението
var_dump($o);
echo "\n\n";
// Пример 2
try {
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // Не съвпада с този тип
echo "Хванато е моето изключение\n", $e;
$e->customFunction();
} catch (Exception $e) { // Ще бъде хванато
echo "Хванато е изключението по подразбиране\n", $e;
}
// Продължаване на изпълнението
var_dump($o);
echo "\n\n";
// Пример 3
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // Ще бъде хванато
echo "Хванато е изключението по подразбиране\n", $e;
}
// Продължаване на изпълнението
var_dump($o);
echo "\n\n";
// Пример 4
try {
$o = new TestException();
} catch (Exception $e) { // Пропуска се, няма изключение
echo "Хванато е изключението по подразбиране\n", $e;
}
// Продължаване на изпълнението
var_dump($o);
echo "\n\n";
?>