Hướng dẫn dùng try finally trong PHP

PHP 5 có mô hình ngoại lệ tương tự như những ngôn ngữ lập trình khác. Ngoại lệ có thẻ được ném (throw) và bắt (catch) trong PHP. Mã lệnh có thể được đặt trong khối try để thuận tiên cho việc phát hiện ngoại lệ. Mỗi khối try phải có ít nhật một khối catch hoặc finally.

Đối tượng được ném ra phải là một thể hiện của lớp Exception hoặc lớp con của nó. Việc cố ném một đối sẽ không có kết quả trong PHP Fatal Error.

catch

Khối nhiều catch có thể được sử dụng để bắt các lớp ngoại lệ khác nhau. Ngoại lệ thông thường (khi không có ngoại lệ nào được ném từ khối try) sẽ tiếp tục sau khối catch cuối cùng được định nghĩa. Ngoại lệ cũng có thể được ném (hoặc ném lại) trong khối catch.

Khi một ngoại lệ được ném thì mã lệnh phía sau trong khối đó sẽ không được thực thi, và PHP sẽ cố tìm khối catch đầu tiên phù hợp với ngoại lệ đó. Nếu ngoại lệ nào đó không bắt được thì PHP Fatal Error sẽ đưa ra thông điệp "Uncaught Exception ..." khi một bộ xửl ý được định nghĩa với phương thức set_exception_handler().

finally

Từ phiên bản PHP 5.5, một khối finally cũng có thể được đặt sau hoặc thay thế cho khối catch. Mã lệnh trong khối finally sẽ luôn luôn được thực thi sau khối try và catch, ngay cả khi ngoại lệ được ném hay không.

Lưu ý

Các hàm trong PHP chủ yếu sử dụng thông báo lỗi, chỉ những phần mở rộng hướng đối tượng hiện đại mới sử dụng ngoại lệ. Tuy nhiên thì các lỗi có thể được chuyển đơn giản sang ngoại lệ với ErrorException.

Gợi ý

Standard PHP Library (SPL) cung cấp một số lượng các ngoại lệ được xây dựng sẵn rất hữu ích.

Ví dụ

Ví dụ ném một ngoại lệ:

<?php
function inverse($x) {
    if (!
$x) {
        throw new 
Exception('Division by zero.');
    }
    return 
1/$x;
}

try {
    echo

inverse(5) . "\n";
    echo 
inverse(0) . "\n";
} catch (
Exception $e) {
    echo 
'Caught exception: ',  $e->getMessage(), "\n";
}

// Tiếp tục thực thi
echo "Hello World\n";
?>

Đoạn mã trên sẽ in ra:

0.2
Caught exception: Division by zero.
Hello World

Ví dụ 2: Xử lý ngoại lệ với khối finally

<?php
function inverse($x) {
    if (!
$x) {
        throw new 
Exception('Division by zero.');
    }
    return 
1/$x;
}

try {
    echo

inverse(5) . "\n";
} catch (
Exception $e) {
    echo 
'Caught exception: ',  $e->getMessage(), "\n";
finally {
    echo 
"First finally.\n";
}

try {
    echo

inverse(0) . "\n";
} catch (
Exception $e) {
    echo 
'Caught exception: ',  $e->getMessage(), "\n";
finally {
    echo 
"Second finally.\n";
}

// Tiếp tục thực thi
echo "Hello World\n";
?>

Ví dụ trên sẽ in ra:

0.2
First finally.
Caught exception: Division by zero.
Second finally.
Hello World

Ví dụ 3: Ngoại lệ lồng

<?php

class MyException extends Exception { }

class

Test {
    public function 
testing() {
        try {
            try {
                throw new 
MyException('foo!');
            } catch (
MyException $e) {
                
// ném lại nó
                
throw $e;
            }
        } catch (
Exception $e) {
            
var_dump($e->getMessage());
        }
    }
}

$foo = new Test;
$foo->testing();

?>

 Ví dụ trên sẽ in ra:

string(4) "foo!"

Xem thêm

Thừa kế ngoại lệ