-----
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: