Trong bài này, chúng ta sẽ tìm hiểu về ngoại lệ (exception) trong PHP. Để học tốt bài này, các bạn cần đọc lại bài Cài đặt môi trường lập trình Web PHP với XAMPP để biết cách chạy ứng dụng web PHP với XAMPP.
1. Exception trong PHP là gì?
Trong PHP, ngoại lệ (exception) là một đối tượng (object) mô tả một lỗi (error) hoặc một vấn đề bất thường của PHP script. Exception có thể được xử lý bằng cách ném (throw) và bắt (catch) trong PHP. Nếu một exception xảy ra mà không được xử lý thì sẽ gây ra Fatal Error trong PHP.
Ném (throw) một ngoại lệ (exception) trong PHP
Câu lệnh throw
cho phép chúng ta ném ra một exception. Khi một exception được ném ra thì các đoạn code sau nó sẽ không được thực thi. Nếu không bắt exception thì Fatal Error sẽ xảy ra với thông báo “Uncaught Exception“.
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
Kết quả
Fatal error: Uncaught Exception: Division by zero
2. Xử lý exception với câu lệnh try catch trong PHP
Chúng ta cần phải bắt (catch) các exception có thể xảy ra để tránh lỗi và không bị dừng chương trình. Trong PHP, câu lệnh try…catch
giúp chúng ta catch các exception. Cú pháp:
try {
//code that can throw exceptions
} catch(Exception $e) {
//code that runs when an exception is caught
}
Ví dụ sử dụng try…catch để bắt exception
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "Unable to divide.";
}
?>
Kết quả
Unable to divide.
Câu lệnh try…catch…finally trong PHP
Câu lệnh try...catch...finally
cũng có thể được sử dụng để catch các exception. Cú pháp:
<?php
try {
//code that can throw exceptions
} catch(Exception $e) {
//code that runs when an exception is caught
} finally {
//code that always runs regardless of whether an exception was caught
}
?>
Các dòng code trong khối lệnh finally
luôn luôn được thực thi mặc dù có xảy ra exception hay không. Nếu có khối lệnh finally
thì khối lệnh catch
có thể có hoặc không.
Ví dụ sử dụng try…catch…finally để bắt exception
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "Unable to divide. <br>";
} finally {
echo "Process complete.";
}
?>
Kết quả
Unable to divide.
Process complete.
Khối lệnh catch có thể có hoặc không khi sử dụng finally
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo "Process complete.";
}
?>
Kết quả
Process complete.
Fatal error: Uncaught Exception: Division by zero
Lưu ý: Có thể không sử dụng catch
khi có finally
. Nhưng nên sử dụng catch
để bắt exception để tránh Fatal Error.
3. Đối tượng Exception trong PHP
Những exception được ném ra đều là một object của lớp Exception. Các đối tượng của lớp Exception chứa các thông tin về error xảy ra. Cú pháp tạo một object Exception:
new Exception($message, $code, $previous)
Trong đó,
- $message: Tham số tùy chọn. Tham số này có kiểu dữ liệu là string, mô tả tại sao exception lại bị ném ra.
- $code: Tham số tùy chọn. Tham số này có kiểu dữ liệu là integer, dùng để phân biệt các ngoại lệ với nhau.
- $previous: Tham số tùy chọn. Nếu ngoại lệ này ném ra từ một ngoại lệ khác thì nên truyền ngoại lệ khác đó vào tham số này.
Một số phương thức thường dùng của lớp Exception
Phương thức | Chức năng |
getMessage() | Trả về một string mô tả tại sao exception được ném ra |
getPrevious() | Nếu ngoại lệ này ném ra từ một ngoại lệ khác thì hàm này sẽ trả về exception khác đó. Nếu không thì trả về null |
getCode() | Trả về mã (code) là một số integer của exception |
getFile() | Trả về đường dẫn của file mà exception được ném ra |
getLine() | Trả về số dòng mà exception được ném ra |
Ví dụ sử dụng các phương thức của lớp Exception
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero", 1);
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $ex) {
$code = $ex->getCode();
$message = $ex->getMessage();
$file = $ex->getFile();
$line = $ex->getLine();
echo "Exception thrown in $file on line $line: [Code $code]
$message";
}
?>
Kết quả
Exception thrown in C:\xampp\htdocs\gochocit\index.php on line 4: [Code 1] Division by zero
Tham khảo: PHP Exceptions w3schools.com, Exceptions php.net