PHP: Thừa kế Ngoại lệ


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

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 0Exception $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 0Exception $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";
    }
}

?>

» Tiếp: set_exception_handler
« Trước: Ngoại lệ (Exception)
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!