PHP: Thừa kế Ngoại lệ
Ta có thể định nghĩa một lớp ngoại lệ riêng bằng cách thừa kế lớp Exception. Các thành phần và thuộc tính phía dưới đây cho thấy khả năng truy cập trong lớp con được dẫn xuất từ lớp Exception.
Ví dụ 1: Lớp Exception
<?php
class Exception
{
protected $message = 'Unknown exception'; // Thông báo ngoại lệ
private $string; // đệm __toString
protected $code = 0; // Mã lệnh ngoại lệ do người dùng định nghĩa
protected $file; // file nguồn của ngoại lệ
protected $line; // dòng nguồn của ngoại lệ
private $trace; // backtrace
private $previous; // ngoại lệ trước nếu có ngoại lệ lồng
public function __construct($message = null, $code = 0, Exception $previous = null);
final private function __clone(); // Không có phép nhân bản ngoại lệ.
final public function getMessage(); // thông báo của ngoại lệ
final public function getCode(); // mã lệnh của ngoại lệ
final public function getFile(); // file nguồn
final public function getLine(); // dòng nguồn
final public function getTrace(); // mảng backtrace()
final public function getPrevious(); // ngoại lệ trước
final public function getTraceAsString(); // chuỗi định dạng để theo dõi
// Có thể ghi đè
public function __toString(); // chuỗi định dạng để hiển thị
}
?>
Nếu một lớp dẫn xuất từ lớp Exception và định nghĩa lại hàm tạo thì bạn nên sử dụng parent::__construct() để đảm bảo rằng tất cả các dữ liệu cho phép sẽ được gán giá trị hợp lệ. Phương thức __toString() có thể được ghi đè để cung cấp một đầu ra tùy chỉnh khi đối tượng được thể hiện dưới dạng chuỗi.
Lưu ý:
Ngoại lệ không thể được sao chép. Việc cố gắng sao chép một ngoại lệ sẽ dẫn tới lỗi E_ERROR
.
Ví dụ 2: Dẫn xuất từ lớp Exception (PHP 5.3.0+)
<?php
/**
* Định nghĩa một lớp ngoại lệ tùy chỉnh
*/
class MyException extends Exception
{
// Định nghĩa lại ngoại lệ nên thông báo không phải là một lựa chọn
public function __construct($message, $code = 0, Exception $previous = null) {
// code
// đảm bảo mọi thứ được gán đúng giá trị
parent::__construct($message, $code, $previous);
}
// chuỗi tùy chỉnh thể hiện lại đối tượng
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "Một hàm tùy chỉnh A custom function for this type of exception\n";
}
}
/**
* Create a class to test the exception
*/
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 custom exception
throw new MyException('1 is an invalid parameter', 5);
break;
case self::THROW_DEFAULT:
// throw default one.
throw new Exception('2 is not allowed as a parameter', 6);
break;
default:
// No exception, object will be created.
$this->var = $avalue;
break;
}
}
}
// Example 1
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // Will be caught
echo "Caught my exception\n", $e;
$e->customFunction();
} catch (Exception $e) { // Skipped
echo "Caught Default Exception\n", $e;
}
// Continue execution
var_dump($o); // Null
echo "\n\n";
// Example 2
try {
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // Doesn't match this type
echo "Caught my exception\n", $e;
$e->customFunction();
} catch (Exception $e) { // Will be caught
echo "Caught Default Exception\n", $e;
}
// Continue execution
var_dump($o); // Null
echo "\n\n";
// Example 3
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // Will be caught
echo "Default Exception caught\n", $e;
}
// Continue execution
var_dump($o); // Null
echo "\n\n";
// Example 4
try {
$o = new TestException();
} catch (Exception $e) { // Skipped, no exception
echo "Default Exception caught\n", $e;
}
// Continue execution
var_dump($o); // TestException
echo "\n\n";
?>
Lưu ý:
Các phiên bản PHP 5 trước PHP 5.3.0 không hỗ trợ ngoại lệ lồng. Đoạn mã sau đây có thể được sử dụng như một lớp MyException thay thế nếu bạn muốn chạy ví dụ này.
<?php
/**
* Define a custom exception class
*/
class MyException extends Exception
{
// Redefine the exception so message isn't optional
public function __construct($message, $code = 0) {
// some code
// make sure everything is assigned properly
parent::__construct($message, $code);
}
// custom string representation of object
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "A custom function for this type of exception\n";
}
}
?>