Ngu ngơ học làm web (86) - Lỗi và ngoại lệ

Tiếp theo của: Ngu ngơ học làm web (85) - Filter và validate trong PHP
-----

Phần 86.       Lỗi và ngoại lệ


Đây là clip số 98:


Các lỗi thường gặp trong PHP:

- Đặt tên hàm, tên biến không theo quy ước (chương trình vẫn chạy bình thường, tuy nhiên gây ra tâm lý rất khó chịu cho các thành viên làm chung)

- Gõ sai tên hàm, tên biến

- Thiếu các dấu kết thúc câu lệnh, dấu bao khối lệnh

- Lỗi khi thực thi đoạn mã

Sử dụng câu lệnh die() để kết thúc ngay chương trình, sử dụng trong quá trình dò tìm và sửa lỗi (debug).

Xem ví dụ sau:

  if (file_exists('data.txt')) {
    $data = file_get_contents('data.txt');
    foreach($data as $key => $value) {
      echo $value['name'] . '<br />';
    }
  } else {
    echo 'File not found';
  }
  echo '<br /> Should not appear'; 

Ở ví dụ trên, trong trường hợp tập tin data.txt không tồn tại, thì đoạn mã sẽ kết thúc ngay khi xuất câu thông báo ‘File not found’, tuy nhiên câu ‘Should not appear’ vẫn xuất hiện.

Sử dụng hàm die($variable) để xuất nội dung $variable và kết thúc chương trình:

  if (file_exists('data.txt')) {
    $data = file_get_contents('data.txt');
    foreach($data as $key => $value) {
      echo $value['name'] . '<br />';
    }
  } else {
    die('File not found');
  }
  echo '<br /> Should not appear';

Ẩn thông báo lỗi trên giao diện web: khi đưa website vào vận hành, nên thiết lập cơ chế để không cho hệ thống hiển thị các thông báo lỗi ra màn hình giao diện. Nếu có lỗi, nên ghi vào tập tin log để theo dõi và tìm cách khắc phục.

Để đọc tập tin cấu hình của PHP, tập tin php.ini, sử dụng hàm: ini_get_all().

Ví dụ,

// xuất giá trị của một tham số
  echo ini_get('date.timezone');
// xuất tất cả các tham số
  $config = ini_get_all();
  echo '<pre>';
  print_r($config);
  echo '</pre>';

Để thay đổi giá trị trong tập tin php.ini, sử dụng hàm ini_set($varname, $newvalue); Ví dụ:

  echo ini_get('date.timezone');
  ini_set('date.timezone', 'Asia/Ho_Chi_Minh');
  echo '<br />';
  echo ini_get('date.timezone');

Ví dụ sau sẽ không hiển thị thông báo lỗi của đoạn mã bên dưới,

  // tắt thông báo lỗi
  ini_set('display_errors', 'off');
  // bật chế độ ghi lỗi vào tập tin log
  ini_set('log_errors', 'on');
  // ghi vào tập tin php_error.log trong thư mục gốc của dự án
  ini_set('error_log', 'php_error.log');
  // đoạn mã sau sẽ có lỗi
  foreach ($array as $key => $value) {
    echo $value;
  }

Cho phép các lỗi nào thì được hiển thị lên giao diện web: sử dụng hàm error_reporting() hoặc ini_set(‘error_reporting’, VALUE)

- Ẩn tất cả lỗi: error_reporting(0)

- Hiển thị tất cả lỗi: error_reporting(E_ALL)

- Hiển thị phần warning: error_reporting(E_WARNING)

- Hiển thị các phần notice: error_reporting(E_NOTICE)

- Giá trị hiển thị được thiết lập mặc định: error_reporting(E_ALL ^ E_NOTICE) // hiển thị tất cả lỗi, nhưng không hiển thị notice.

Đây là clip số 99:


Tùy biến hàm xuất thông báo lỗi:

error_function(error_level, error_message, error_file, error_line, error_context)
- error_level: gồm E_NOTICE, E_WARNING, E_ALL,…
- error_message: nội dung thông báo lỗi muốn hiển thị
- error_file: tên tập tin xảy ra lỗi
- error_line: lỗi ở hàng nào
- error_context: thông tin liên quan đến các biến GET, POST,…

Ví dụ,

function myError($error_level, $error_message, $error_file, $error_line, $error_context) {
    // các biến ($error_level, $error_message, $error_file, $error_line, $error_context)
    // đều đã có giá trị, sẽ tùy biến việc hiển thị
    $result[] = 'Mã lỗi: ' . $error_level . '<br />';
    $result[] = 'Tên lỗi: ' . $error_message . '<br />';
    $result[] = 'Tập tin bị lỗi: ' . $error_file . '<br />';
    $result[] = 'Lỗi tại hàng: ' . $error_line . '<br />';

    $result = implode(' ', $result);
    die($result);
  }
  // đăng kí các thông báo lỗi
  set_error_handler('myError');
  // đoạn mã tạo ra lỗi
  foreach ($array as $key => $value) {
    echo $value;

  }
-----------
Cập nhật [16/9/2020]
-----------
Xem thêm: