Home Back-End Bài 20: Lỗi (Error) và cách xử lý lỗi trong PHP

Bài 20: Lỗi (Error) và cách xử lý lỗi trong PHP

by Tân Hồng IT

Ở bài trước chúng ta đã tìm hiểu qua về ngoại lệ cũng như các cách xử lý ngoại lệ trong PHP. Tiếp tục series học PHP căn bản, bạn sẽ tìm hiểu về lỗi (Error), những loại lỗi có trong PHP và phương pháp xử lý lỗi hiệu quả cho code PHP của bạn.

xu-ly loi error php

Xử lý lỗi (Error) Trong PHP

Lỗi là gì?

Vào một ngày đẹp trời nào đó bạn truy cập và sử dụng website hoặc ứng dụng của bạn và thấy nó hoạt động không đúng theo mong muốn của bạn thì đó chính là lỗi.

Việc xử lý lỗi (Error) trong PHP là một phần quan trọng. Nếu code của bạn thiếu phần kiểm tra lỗi, chương trình của bạn sẽ không chuyên nghiệp và có thể gặp rủi ro về bảo mật.

Phân loại lỗi

Chúng ta sẽ chia ra 3 loại lỗi như sau:

Lỗi cú pháp (syntax error)

  • Xuất hiện khi ta viết code.
  • Được thông báo khi ta thực thi trang.
  • Nguyên nhân: viết sai hoặc thiếu cú pháp.

Lỗi thực thi

  • Xảy ra khi ta thực thi trang.
  • Khó xác định hơn lỗi cú pháp.
  • Nguyên nhân: Mở một tập tin không tồn tại, chia cho 0, truy xuất bảng không tồn tại trong cơ sở dữ liệu,…

Lỗi luận lý

  • Xảy ra khi ta thực thi trang
  • Được thể hiện dưới những hình thức hoặc những kết quả không mong đợi.
  • Nguyên nhân: sai lầm trong giải thuật.

Vậy tại sao phải xử lý lỗi

Việc website của bạn có lỗi là một vấn đề rất cần quan tâm. Lỗi là điều không mong muốn và gây khó chịu hoặc tạo một số hiểu cho người dùng. Có thể làm mất dần lượt truy cập từ khách.

Không những thế lỗi trong PHP nếu không giải quyết sớm sẽ đem lại rất nhiều vấn đề về bảo mật, dễ bị hacker tấn công,..

Chính vì vậy mà ta cần phải xử lý lỗi trong thời gian thật sớm để tránh gây khó chịu cho người dùng cũng như tăng tính bảo mật thêm cho website.

Tìm hiểu về các cấp độ lỗi trong PHP

Thông thường, khi có sự cố ngăn tập lệnh chạy đúng, công cụ PHP sẽ gây ra lỗi. Mỗi lỗi được biểu thị bằng một giá trị nguyên và hằng số liên quan. Bảng sau liệt kê một số cấp độ lỗi phổ biến:

Cấp độ lỗiGiá trịMô tả
E_ERROR1Một lỗi Runtime nghiêm trọng, không thể được phục hồi. Việc thực thi kịch bản được dừng lại ngay lập tức
E_WARNING2Một cảnh báo runtime. Nó không trí mạng và hầu hết các lỗi có xu hướng rơi vào loại này. Việc thực thi kịch bản sẽ không dừng lại.
E_NOTICE8Một thông báo runtime. Cho biết rằng tập lệnh gặp phải lỗi có thể xảy ra, mặc dù tình huống cũng có thể xảy ra khi chạy tập lệnh bình thường
E_USER_ERROR256Một thông báo lỗi do người dùng tạo ra. Điều này giống như một E_ERROR, ngoại trừ nó được tạo bởi tập lệnh PHP bằng cách sử dụng hàm trigger_error () chứ không phải là PHP engine
E_USER_WARNING512Một thông điệp cảnh báo không trí mạng do người dùng tạo ra. Điều này giống như một E_WARNING, ngoại trừ nó được tạo bởi tập lệnh PHP bằng cách sử dụng hàm trigger_error () chứ không phải PHP engine
E_USER_NOTICE1024Một thông báo thông báo do người dùng tạo. Điều này giống như một E_NOTICE, ngoại trừ nó được tạo bởi tập lệnh PHP bằng cách sử dụng hàm trigger_error () chứ không phải PHP engine
E_STRIC2048Không hoàn toàn là một lỗi, nhưng được kích hoạt bất cứ khi nào PHP gặp mã có thể dẫn đến sự cố hoặc chuyển tiếp không tương thích
E_ALL8189Tất cả các lỗi và cảnh báo, ngoại trừ E_STRICT trước PHP 5.4.0.

Để tìm hiểu thêm, bạn có thể xem tại trang chủ của PHP tại đây

PHP Engine gây ra lỗi bất cứ khi nào nó gặp sự cố với tập lệnh của bạn, nhưng bạn cũng có thể tự kích hoạt lỗi để tạo ra nhiều thông báo lỗi thân thiện với người dùng hơn.

Xử lý lỗi cơ bản với hàm die() trong PHP

Die statements – hàm die() là hàm kết hợp giữa echo và hàm thoát lại với nhau. Nó phù hợp khi chúng ta muốn hiển thị một tin nhắn đến người dùng và ngừng lại kịch bản thực thi khi gặp lỗi.

Ví dụ:

<?php
  $denominator = 0;
  if ($denominator == 0) {
    die("Number is zero.");
  } else {
    echo 2 / $denominator;
  }
?>

Bây giờ khi chạy file, nếu biến $denominator có giá trị bằng 0 thì hàm die sẽ xuất ra thông báo lỗi được ta định sẵn đến cho người dùng. Còn nếu biến này có giá trị khác 0 thì phép chia sẽ tiếp tục được thực thi.

Giả sử nếu ta không sử dụng hàm die mà thực hiện code chay như bên dưới các bạn sẽ nhận được một hộp báo lỗi cực xấu đến người dùng:

<?php
  $denominator = 0;
  echo 2 / $denominator;

thong bao loi error php

Dĩ nhiên là thông báo lỗi này không được thân thiện cho lắm. Nên người dùng sẽ không hiểu là lỗi gì. Họ chỉ biết là họ đang có trải nghiệm tệ.

Hàm die() được sử dụng ở trên chỉ đơn giản hiển thị thông báo lỗi tùy chỉnh và chấm dứt tập lệnh hiện tạ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.

Tạo một trình xử lý lỗi tuỳ chỉnh 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ố

Cú pháp:

error_function_name(error_level, error_message, error_file, error_line, error_context)
ParameterDescription
error_function_nameTên của hàm xử lý lỗi.
error_levelBắ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_messageBắt buộc. Chỉ định thông báo lỗi cho lỗi do người dùng định nghĩa.
error_fileTùy chọn. Chỉ định tên file mà lỗi có thể xảy ra.
error_lineTùy chọn. Chỉ định dòng của file mà lỗi có thể xảy ra.
error_contextTù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.

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

<?php
function calcDivision($dividend, $divisor){
    if($divisor == 0){
        trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING);
        return false;
    } else{
        return($dividend / $divisor);
    }
}
?>

Trong đó E_USER_WARNING là cấp độ báo cáo lỗi và mình đã liệt kê ở phần trên các bạn có thể lướt lên để xem lại.

Ví dụ 2: tạo một trình xử lý lỗi tuỳ chỉnh:

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

Ta đã tạo được một hàm xử lý thông báo lỗi, giờ ta cần thiết lập tuỳ chỉnh ra màn hình cho nó.

Thiết lập trình xử lý lỗi tuỳ chỉnh PHP

Chúng ta sẽ sử dụng custom error handlers để thiết lập trình xử lý lỗi thông qua hàmset_error_handler()

Cú pháp:

set_error_handler("customError");

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

Từ ví dụ 2 ở phần tạo trình xử lý lỗi, ta sẽ thiết lập tiếp như sau:

<?php
function customError($errno, $error_msg)
{
    echo "<b>Error:</b> [$errno] <br>";
    echo "<b>Error Description:</b> $error_msg <br>";
    echo "Ending Script";
}
set_error_handler("customError");
echo (5 / 0);

Kết quả xuất ra màn hình là:

thiet lap trinh xu ly loi

Như bạn thấy đó, custom error handlers cho phép chúng ta tùy chỉnh tin nhắn thông báo lỗi cho thân thiện và rõ ràng hơn chứ không phải một bảng lỗi màu cam xấu xí nữa.

Ghi nhật ký lỗi

Đôi khi bạn cần báo cáo lại lỗi cho leader hoặc muốn tạo nhật ký lỗi đã từng gặp trong quá trình làm việc của bạn. Bạn cũng có thể ghi nhật ký chi tiết lỗi vào file text như sau:

<?php
function calcDivision($dividend, $divisor){
    if($divisor == 0){
        trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING); //kích hoạt lỗi
        return false;
    } else{
        return($dividend / $divisor);
    }
}
//hàm xuất lỗi
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    $message .= "Error: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
    $message .= "Variables:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 3, "C:/wamp64/www/demo/log/app_errors.log");
    die("There was a problem, please try again.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "This will never be printed.";
?>

Gửi lỗi qua Email

Bạn cũng có thể gửi e-mail với các chi tiết lỗi bằng cách sử dụng cùng hàm error_log().

<?php
function calcDivision($dividend, $divisor){
    if ($divisor == 0){
        trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING); //kích hoạt lỗi
        return false;
    } else{
        return($dividend / $divisor);
    }
}

function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    $message .= "Error: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
    $message .= "Variables:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 1, "webmaster@example.com"); //thay đổi gmail ở đây.
    die("There was a problem, please try again. Error report submitted to webmaster.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "This will never be printed.";
?>

Sử dụng try catch để dò lỗi

Áp dụng từ bài học trước về cách xử lý ngoại lệ thì tương tự trong bài này chúng ta có thể dò lỗi thông qua việc sử dụng try catch như sau:

<?php
try{
 // Khối xử lý, đoạn muốn bắt lỗi
}
catch(Exception $ex)
{
 echo "<p>Lỗi hiện tại: " . $e->getMessage() . "</p>"; //xuất thông báo về lỗi
}
?>

Nếu dòng nào trong khối lệnh có khả năng tạo ra lỗi thì hàm getMessage() sẽ đảm nhận nhiệm vụ xuất thông tin lỗi ra màn hình.

Tổng kết

Khi lập trình với những dự án nhỏ hoặc các bài tập demo, đồ án cuối khóa, đồ án cuối môn học, có thể bạn không cần các khối try catch để bắt lỗi.

Tuy nhiên, khi vào công ty hoặc làm các dự án lớn, khi hệ thống vận hành tốt thì không sao. Khi hệ thống gặp lỗi nào đó hoặc khách hàng report lỗi thì lúc đó bạn sẽ thấy mệt mỏi với việc dò từng dòng code. Đó là khi bạn sẽ thấy xử lý lỗi và ngoại lệ là những điều cực kỳ quan trọng.

Mỗi bài viết về kiến thức học PHP của mình đều có thể chưa hoàn toàn đầy đủ, cho nên mong các bạn hãy tra google khi tham khảo và mong bạn có thể gửi lại comment bổ sung bên dưới để mình có thể hoàn thiện lại bài viết hơn. Cảm ơn các bạn!

Nếu các bạn cảm thấy Website TanHongIT.Com thật sự hữu ích mình mong các bạn có thể chia sẻ những bài viết đến cho cộng đồng cùng thao khảo nhé. Cảm ơn các bạn !!!

Các bạn có bất kì thắc mắc cần được hỗ trợ hay yêu cầu các phần mềm, thủ thuật, khoá học,… thì cứ để lại comment bên dưới bài viết hoặc liên hệ qua fanpage của TanHongIT để được hỗ trợ nhé! Mình sẽ cố gắng chia sẻ cho các bạn mọi thứ cần thiết nhất!

Tham khảo:

Xem thêm:

Tổng hợp Internet

CHÚC CÁC BẠN THÀNH CÔNG VÀ VUI VẺ

Related Posts

0 0 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x