Xử lý lỗi trong PHP

Xử lý lỗi là quá trình bắt lỗi do chương trình của bạn gây ra và sau đó thực hiện hành động thích hợp. Nếu bạn sẽ xử lý lỗi không đúng thì nó có thể dẫn đến nhiều hậu quả không lường trước được. Trong PHP rất đơn giản để xử lý một lỗi. Một thông báo lỗi với tên tệp, số dòng và thông báo mô tả lỗi được gửi đến trình duyệt. Trong bài viết này, cùng eLib tìm hiểu cách xử lý lỗi trong PHP.

Xử lý lỗi trong PHP

1. Xử lý lỗi cơ bản - Sử dụng câu lệnh die()

Ví dụ đơn giản mở file trong PHP:

<?php
$file = fopen("welcome.txt", "r");
?>

Nếu tệp không tồn tại, bạn có thể gặp lỗi như sau:

Warning: fopen(welcome.txt): failed to open stream: No such file or directory in C:\xampp\htdocs\php\xu-ly-loi-1.php on line 2

Để ngăn người dùng nhận được thông báo lỗi như thông báo ở trên, chúng ta kiểm tra xem file có tồn tại hay không trước khi truy cập vào nó:

<?php
if (!file_exists("welcome.txt"))
{
    die("File not found.");
}
else
{
    $file = fopen("welcome.txt", "r");
}
?>

Bây giờ nếu tập tin không tồn tại bạn nhận được một lỗi như thế này:

File not found.

Đoạn code trên hiệu quả hơn code trước, vì nó sử dụng cơ chế xử lý lỗi đơn giản để dừng tập lệnh sau lỗi.

Tuy nhiên, đơn giản là dừng tập lệnh không phải lúc nào cũng đúng. Chúng ta hãy xem xét các hàm PHP thay thế để xử lý lỗi khác.

2. Xử lý lỗi cơ bản - Lỗi trùy chỉnh

Việc tạo trình xử lý lỗi tùy chỉnh khá đơn giản. Chúng ta chỉ cần tạo ra một hàm đặc biệt có thể được gọi khi một lỗi xảy ra trong PHP.

Hàm này phải có khả năng xử lý tối thiểu hai tham số (mức lỗi và thông báo lỗi) nhưng có thể chấp nhận tối đa năm tham số (tùy chọn: tệp, dòng số và ngữ cảnh lỗi):

Cú pháp:

error_function(error_level, error_message, error_file, error_line, error_context)

 

Parameter Description
error_level Bắt buộc. Chỉ định mức báo cáo lỗi cho lỗi do người dùng định nghĩa. Phải là một số giá trị. Xem bảng bên dưới để biết các mức báo cáo lỗi có thể xảy ra.
error_message Bắt buộc. Chỉ định thông báo lỗi cho lỗi do người dùng định nghĩa.
error_file Tùy chọn. Chỉ định tên file mà lỗi có thể xảy ra.
error_line Tùy chọn. Chỉ định dòng của file mà lỗi có thể xảy ra.
error_context Tùy chọn. Chỉ định một mảng chứa mọi biến và giá trị của chúng, được sử dụng khi lỗi xảy ra.

Mức báo cáo lỗi

Các mức báo cáo lỗi này là các loại lỗi khác nhau mà trình xử lý lỗi do người dùng định nghĩa có thể được sử dụng cho:

Giá trị Hằng số Mô tả
2 E_WARNING Lỗi runtime không nghiêm trọng. Việc thực thi tập lệnh không bị tạm dừng.
8 E_NOTICE Thông báo runtime. Tập lệnh tìm thấy thứ gì đó có thể là lỗi, nhưng cũng có thể xảy ra khi chạy tập lệnh thông thường.
256 E_USER_ERROR Lỗi nghiêm trọng do người dùng tạo. Nó giống như một E_ERROR được thiết lập bởi lập trình viên bằng cách sử dụng hàm PHP trigger_error()
512 E_USER_WARNING Cảnh báo không nghiêm trọng do người dùng tạo. Nó giống như một E_WARNING được thiết lập bởi lập trình viên bằng cách sử dụng hàm trigger_error()
1024 E_USER_NOTICE Thông báo do người dùng tạo. Nó giống như một E_NOTICE được thiết lập bởi lập trình viên bằng cách sử dụng hàm trigger_error().
4096 E_RECOVERABLE_ERROR Lỗi nghiêm trọng có thể bắt được. Nó giống như một E_ERROR nhưng có thể bị bắt bởi một người dùng xác định xử lý (xem thêm set_error_handler()).
8191 E_ALL Tất cả các lỗi và cảnh báo (E_STRICT trở thành một phần của E_ALL trong PHP 5.4).

Ví dụ, xử lý lỗi trong PHP:

function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Ending Script";
  die();
}

Đoạn mã trên là một hàm xử lý lỗi đơn giản. Khi nó được kích hoạt, nó sẽ nhận được mức lỗi và một thông báo lỗi. Sau đó nó sẽ xuất ra mức lỗi và thông báo và chấm dứt tập lệnh.

Chúng ta đã tạo ra một hàm xử lý lỗi, chúng ta cần phải quyết định khi nào nó được kích hoạt.

3. Thiết lập trình xử lý lỗi

Hàm set_error_handler() được sử dụng để thiết lập trình xử lý lỗi trong PHP.

Có thể thay đổi trình xử lý lỗi chỉ áp dụng cho một số lỗi, theo cách đó, tập lệnh có thể xử lý các lỗi khác nhau theo các cách khác nhau. Tuy nhiên, trong ví dụ này, chúng ta sẽ sử dụng trình xử lý lỗi tùy chỉnh của chúng ta cho tất cả các lỗi:

set_error_handler("customError");

Trong đó: customError là tên của hàm xử lý lỗi.

Ví dụ, kiểm tra trình xử lý lỗi bằng cách in biến không tồn tại:

<?php
//hàm xử lý lỗi
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr";
}

//thiết lập trình xử lý lỗi
set_error_handler("customError");

//kích hoạt lỗi
echo ($test);
?>

Kết quả:

Error: [8] Undefined variable: test

4. Kích hoạt một lỗi

Trong một kịch bản mà người dùng có thể nhập dữ liệu, nó rất hữu ích để kích hoạt các lỗi để xác thực các hạng mục đầu vào. Trong PHP, điều này được thực hiện bởi hàm trigger_error().

Ví dụ: Trong ví dụ này, lỗi xảy ra nếu biến "test" lớn hơn "1":

<?php
$test = 2;
if ($test >= 1)
{
    trigger_error("test phải nhỏ hơn hoặc bằng 1.");
}
?>

Kết quả:

Notice: test phải nhỏ hơn hoặc bằng 1. in C:\xampp\htdocs\php\constant1.php on line 4

Một lỗi có thể được kích hoạt bất cứ nơi nào bạn muốn trong một kịch bản, và bằng cách thêm một tham số thứ hai, bạn có thể chỉ định mức độ lỗi nào được kích hoạt.

Các loại lỗi có thể xảy ra:

  • E_USER_ERROR - Lỗi runtime do người dùng tạo. Lỗi không thể phục hồi được. Thực thi tập lệnh bị tạm dừng.
  • E_USER_WARNING - Cảnh báo runtime do người dùng tạo không gây chết chương trình. Việc thực thi tập lệnh không bị tạm dừng.
  • E_USER_NOTICE - Mặc định. Thông báo runtime do người dùng tạo. Tập lệnh tìm thấy thứ gì đó có thể là lỗi, nhưng cũng có thể xảy ra khi chạy tập lệnh thông thường.

Ví dụ:

Trong ví dụ này, E_USER_WARNING xảy ra nếu biến "test" lớn hơn "1". Nếu xảy ra E_USER_WARNING, chúng ta sẽ sử dụng trình xử lý lỗi tùy chỉnh và kết thúc tập lệnh:

<?php
//hàm xử lý lỗi
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "Ending Script";
    die();
}

//thiết lập trình xử lý lỗi
set_error_handler("customError", E_USER_WARNING);

//kích hoạt lỗi
$test = 2;
if ($test >= 1)
{
    trigger_error("test phải nhỏ hơn hoặc bằng 1.", E_USER_WARNING);
}
?>
Kết quả:
Error: [512] test phải nhỏ hơn hoặc bằng 1.
Ending Script

5. Log lỗi trong PHP

Theo mặc định, PHP sẽ gửi một bản ghi lỗi tới hệ thống ghi log của máy chủ hoặc một file, tùy thuộc vào cách cấu hình error_log được đặt trong tệp php.ini. Bằng cách sử dụng hàm error_log(), bạn có thể gửi nhật ký lỗi tới một file được chỉ định hoặc một đích đến từ xa.

Gửi thông báo lỗi cho chính mình bằng e-mail có thể là cách tốt để nhận được thông báo về các lỗi cụ thể.

6. Gửi một thông báo lỗi bằng E-Mail

Trong ví dụ dưới đây, chúng tôi sẽ gửi một e-mail có thông báo lỗi và kết thúc tập lệnh, nếu xảy ra lỗi cụ thể:

<?php
//hàm xử lý lỗi
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "Webmaster has been notified";
    error_log("Error: [$errno] $errstr", 1, "someone@example.com", "From: webmaster@example.com");
}

//thiết lập trình xử lý lỗi
set_error_handler("customError", E_USER_WARNING);

//kích hoạt lỗi
$test = 2;
if ($test >= 1)
{
    trigger_error("test phải nhỏ hơn hoặc bằng 1.", E_USER_WARNING);
}
?>

Kết quả:

Error: [512] test phải nhỏ hơn hoặc bằng 1.
Webmaster has been notified

Nội dung email giống như sau:

Error: [512] test phải nhỏ hơn hoặc bằng 1.

Bạn không nên áp dụng điều này với tất cả các lỗi. Các lỗi thường xuyên phải được ghi lại trên máy chủ bằng cách sử dụng hệ thống ghi nhật ký PHP mặc định.

Trên đây là bài viết của eLib.VN về xử lý lỗi trong PHP. Như vậy bạn đã được học về cách xử lý lỗi trong PHP và các cấp độ lỗi. Xử lý lỗi mềm dẻo để có được một ứng dụng, trang web thân thiện hơn. Đây cũng là kỹ năng quan trọng để giúp bạn có thể kiểm soát tốt hơn ứng dụng của mình. Chúc các bạn thành công!

Ngày:10/10/2020 Chia sẻ bởi:

CÓ THỂ BẠN QUAN TÂM