Xử lý lỗi ngoại lệ, giới thiệu khối try…catch trong PHP
- 13-03-2023
- Toanngo92
- 0 Comments
Mục lục
Hàm die()
Người dùng phải đánh giá bất kỳ tình trạng lỗi nào trong khi viết mã PHP. Mục đích của hàm die() tương tự như mục đích của hàm exit(). Tuy nhiên, nó cũng có thể giúp xử lý lỗi. die() có thể được sử dụng để tạm dừng chương trình nếu bắt gặp bất kỳ lỗi nào có thể xảy ra.
Ví dụ:
$filename = "example.txt";
$file = fopen($filename, "r") or die("Unable to open file!");
// Rest of code...
fclose($file);
Xử lý ngoại lệ
Một ngoại lệ là một sự kiện xảy ra trong quá trình thực thi chương trình dẫn đến sự gián đoạn luồng hướng dẫn bình thường của chương trình. Thông thường, lỗi thời gian chạy gây ra ngoại lệ.
PHP có mô hình xử lý ngoại lệ tương tự như một số ngôn ngữ lập trình khác. Ngoại lệ cung cấp khả năng kiểm soát tốt hơn khi xử lý lỗi. Điều này làm cho chúng cực kỳ quan trọng trong lập trình.
Cơ chế xử lý ngoại lệ trong lập trình:
- try: Chúng ta đặt logic khối lệnh bên trong try, nếu khối lệnh chạy không gặp bất kỳ lỗi runtime nào, tất cả lệnh bên trong khối try sẽ được thực thi tuần tự cho tới khi kết thúc khối, nếu gặp
- catch: khối lệnh bên trong catch sẽ được chạy khi bất kỳ lệnh nào trong khối try gặp lỗi.
- throw: từ khóa throw được sử dụng khi gặp logic muốn chủ động ném ra ngoại lệ và nhảy vào khối catch. Sử dụng throw bắt buộc phải có từ khóa catch
Khi một ngoại lệ được ném ra, chương trình sau câu lệnh sẽ ngừng chạy. Sau đó, PHP sẽ cố gắng định vị khối catch tương ứng đầu tiên. Trong trường hợp không bắt được ngoại lệ, người dùng sẽ thấy PHP Fatal Error gây ảnh hưởng tới trải nghiệm người dùng.
Những điều quan trọng cần nhớ khi ném một ngoại lệ như sau:
- Trong một khối catch, các ngoại lệ có thể được throw (ném) hoặc re-throw (ném lại).
- Mỗi khối try phải có tối thiểu một khớp với một khối catch. Người dùng có thể sử dụng nhiều hơn một khối catch để bắt nhiều loại ngoại lệ.
- Có thể bắt và ném một ngoại lệ trong PHP. Mã có thể bắt ngoại lệ thành công có thể được bao gồm trong khối try.
Khối lệnh try catch
Người dùng có thể thực hiện câu lệnh try … catch để bắt ngoại lệ và để bắt ngoại lệ và tiếp tục quá trình.
Cú pháp:
try{
// todo
}catch($exception){
// todo
}
<?php
try {
$val = 5/0;
echo $val;
} catch (\DivisionByZeroError $e) {
echo "Sorry, division not possible";
}
echo "<br><br>Program continues further.";
?>
Người dùng cũng có thể sử dụng try … catch … finally để bắt ngoại lệ.
Mã được viết trong khối finally sẽ luôn được thực thi bất kể ngoại lệ có bị bắt hay không. Khối catch là tùy chọn nếu khối finally đã tồn tại và việc bắt ngoại lệ không phải là ưu tiên.
Cú pháp:
try{
// todo
}catch($exception){
// todo
}finally{
// todo
}
Ví dụ:
<?php
try {
$val = 5/0;
echo $val;
} catch (DivisionByZeroError $e) {
echo "Sorry, division not feasible";
} finally {
echo "<br><br>Program continues further.";
}
?>
Ném ngoại lệ (Throwing Exceptions)
Các lớp PHP khác nhau ‘throw’ một ngoại lệ. Các lớp do người dùng định nghĩa cũng có thể đưa ra các ngoại lệ.
Ví dụ:
<?php
function divide($dividend, $divisor) {
if ($divisor === 0) {
throw new Exception('Division by zero.');
}
return $dividend / $divisor;
}
try {
$value = divide(5, 0);
echo $value;
} catch(Exception $ex) {
echo 'Caught exception: ', $ex->getMessage();
}
?>
Đối tượng Exception
Đối tượng Exception bao gồm thông tin về hành vi không lường trước được hoặc lỗi mà một chức năng gặp phải.
Mô tả các tham số (parameter) được sử dụng với đối tượng Exception:
Tham số | Mô tả |
Previous | Không bắt buộc. Đây là một chuỗi giải thích lý do tại sao một ngoại lệ đã được đưa ra |
Code | Không bắt buộc. Đây là một số nguyên có thể được sử dụng để phân biệt ngoại lệ này với các ngoại lệ khác cùng kiểu |
message | Không bắt buộc. Bạn nên chuyển một ngoại lệ vào tham số thông báo nếu ngoại lệ đó bị ném vào khối catch của các ngoại lệ khác. |
Một số phương thức có thể được sử dụng để truy xuất thông tin về một ngoại lệ trong khi bắt nó.
Mô tả các phương thức (method) được sử dụng với đối tượng Exception:
Phương thức | Mô tả |
getPrevious() | Phương thức này trả về một ngoại lệ trước đó nếu ngoại lệ đó được kích hoạt bởi một ngoại lệ khác. |
getFile() | Phương thức này trả về đường dẫn đầy đủ của tệp trong đó ngoại lệ được đưa ra. |
getMessage() | Phương thức này trả về một chuỗi giải thích lý do ném ngoại lệ. |
getCode() | Phương thức này trả về mã ngoại lệ. |
getLine() | Phương thức này trả về số dòng của dòng mã mà ngoại lệ được ném ra. |
Ví dụ:
<?php
try {
$numerator = 10;
$denominator = 0;
if ($denominator == 0) {
throw new Exception('Division by zero.');
}
$result = $numerator / $denominator;
echo "The result is: " . $result;
} catch (Exception $e) {
echo "Caught exception: " . $e->getMessage() . $e->getFile() . $e->getPrevious() . $e->getCode(). $e->getLine();
} finally {
echo "<br> This block gets executed no matter what.";
}
?>