PHP การจัดการข้อผิดพลาด

ใน PHP จะมีการจัดการความผิดพลาดที่ง่ายโดยมาตรฐาน ข้อความหนึ่งจะถูกส่งไปยังเบราเซอร์ ซึ่งมีชื่อไฟล์ หมายเลขบรรทัด และข้อความเล่าถึงความผิดพลาด

PHP การจัดการข้อผิดพลาด

ในการสร้างสคริปต์และแอปพลิเคชันเว็บ การจัดการข้อผิดพลาดเป็นส่วนที่สำคัญ หากตัวแปรที่รับผิดชอบตรวจสอบข้อผิดพลาดของคุณขาดหาย รหัสของคุณจะดูไม่มีความเป็นมืออาชีพ และเปิดโอกาสที่มีความเสี่ยงด้านความปลอดภัย

ตัวเรียนนี้นำเสนอวิธีการตรวจสอบข้อผิดพลาดที่สำคัญที่สุดใน PHP

เราจะเผยแพร่วิธีการจัดการข้อผิดพลาดที่ต่างกัน:

  • คำสั่ง "die()" ง่ายๆ
  • ข้อผิดพลาดที่เป็นของตัวเอง และตัวกดตัวเตือน
  • รายงานข้อผิดพลาด

การจัดการข้อผิดพลาดฺพื้นฐาน: ใช้ฟังก์ชัน die()

ตัวอย่างรหัสที่เปิดไฟล์ทางตรงของข้อความที่แสดงด้านล่าง:

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

หากไฟล์ไม่มีอยู่ คุณจะได้ข้อความเตือนที่คล้ายๆ นี้:

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: 
No such file or directory in C:\webfolder\test.php on line 2

เพื่อที่ผู้ใช้จะไม่ได้ข้อความข้อผิดพลาดที่คล้ายๆ ที่อยู่ด้านบน คุณต้องตรวจสอบว่าไฟล์มีอยู่หรือไม่ก่อนที่จะเข้าถึงไฟล์:

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

ตอนนี้ หากไฟล์ไม่มีอยู่ คุณจะได้ข้อความข้อผิดพลาดที่คล้ายๆ นี้:

File not found

เมื่อเทียบกับรหัสที่อยู่ด้านหน้า รหัสด้านบนนี้มีประสิทธิภาพมากขึ้น เนื่องจากมีกลไกจัดการข้อผิดพลาดที่หยุดบทบัญญัติหลังจากที่มีข้อผิดพลาด

อย่างไรก็ตาม การเลิกบทบัญญัติแบบเรียบง่ายไม่จำเป็นที่เหมาะสมทุกครั้ง ขอให้เราศึกษาฟังก์ชันที่ใช้ในการจัดการข้อผิดพลาดใน PHP

สร้างฟังก์ชันการจัดการข้อผิดพลาดที่เป็นของตัวเอง

ทำการสร้างฟังก์ชันการจัดการข้อผิดพลาดที่เป็นของตัวเองเป็นไปได้ง่ายโดยตรง พวกเราเรียกฟังก์ชันพิเศษนี้เมื่อมีข้อผิดพลาดใน PHP。

ฟังก์ชันนี้จำเป็นที่จะมีความสามารถในการจัดการอย่างน้อยสองตัวแปร (ระดับข้อผิดพลาด และข้อความข้อผิดพลาด),แต่สามารถรับอาญาสองห้าตัวแปร (ตัวเลือก: file, line-number และ error context) ได้:

ระบบทางภาษา

error_function(error_level, error_message,
error_file, error_line, error_context)
ตัวแปร Description
error_level

จำเป็น。ระดับรายงานข้อผิดพลาดที่กำหนดโดยผู้ใช้ ต้องเป็นค่าตัวเลข。

ดูตารางด้านล่าง: ระดับรายงานข้อผิดพลาด。

error_message จำเป็น。ข้อกำหนดข้อความข้อผิดพลาดที่กำหนดโดยผู้ใช้。
error_file Optional. Specifies the filename where the error occurred.
error_line Optional. Specifies the line number where the error occurred.
error_context Optional. Specifies an array containing each variable in use and their values when an error occurs.

Error Reporting Levels

ระดับรายงานความผิดพลาดนี้เป็นชนิดของความผิดพลาดที่บรรณาธิการความผิดพลาดต้องการจัดการ

Value Constant Description
2 E_WARNING ความผิดพลาดที่ไม่เป็นอันตรายในระหว่างเวลาทำงาน ไม่หยุดการปฏิบัติการของสคริปต์
8 E_NOTICE

Run-time 通知

สคริปต์สังเกตว่าอาจมีความผิดพลาดเกิดขึ้น แต่อาจเกิดขึ้นในระหว่างการทำงานปกติของสคริปต์

256 E_USER_ERROR ความผิดพลาดที่สร้างโดยผู้ใช้ มีความเสี่ยง คล้ายกับ E_ERROR ที่ตั้งค่าโดยพัฒนาโปรแกรมผ่านฟังก์ชัน trigger_error() ของ PHP
512 E_USER_WARNING คำเตือนที่สร้างโดยผู้ใช้ ไม่เป็นอันตราย คล้ายกับ E_WARNING ที่ตั้งค่าโดยพัฒนาโปรแกรมผ่านฟังก์ชัน trigger_error() ของ PHP
1024 E_USER_NOTICE คำเตือนที่สร้างโดยผู้ใช้ คล้ายกับ E_NOTICE ที่ตั้งค่าโดยพัฒนาโปรแกรมผ่านฟังก์ชัน trigger_error() ของ PHP
4096 E_RECOVERABLE_ERROR ความผิดพลาดที่สามารถจับกุมได้ คล้าย E_ERROR แต่สามารถถูกจับกุมโดยบรรณาธิการที่กำหนดโดยผู้ใช้ (ดู set_error_handler())
8191 E_ALL

ความผิดพลาดและคำเตือนทั้งหมด ยกเว้นระดับ E_STRICT

(ใน PHP 6.0 ระดับ E_STRICT คือส่วนหนึ่งของ E_ALL)

ตอนนี้ ให้สร้างฟังก์ชันที่จะจัดการความผิดพลาด

function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "สิ้นสุดสคริปต์";
 die();
 }

รหัสบทที่กำหนดขึ้นข้างต้นเป็นฟังก์ชันบรรณาธิการความผิดพลาดที่เรียบง่าย เมื่อมีการเรียกใช้ฟังก์ชันนี้ มันจะได้รับระดับความผิดพลาดและข้อความความผิดพลาด หลังจากนั้นมันจะทำการแสดงระดับความผิดพลาดและข้อความ และหยุดสคริปต์

ตอนนี้ เราได้สร้างฟังก์ชันบรรณาธิการความผิดพลาดแล้ว พวกเราต้องตัดสินว่าในตอนไหนจะทำงานฟังก์ชันนี้

Set Error Handler

บรรณาธิการความผิดพลาดปริมาณเริ่มต้นของ PHP คือบรรณาธิการความผิดพลาดที่เป็นส่วนนอก พวกเราตั้งใจที่จะปรับปรุงฟังก์ชันที่กำหนดขึ้นไปเพื่อใช้เป็นบรรณาธิการความผิดพลาดปริมาณเริ่มต้นของสคริปต์ระหว่างการทำงาน

สามารถปรับแก้บรรณาธิการความผิดพลาดเพื่อให้ใช้งานเฉพาะความผิดพลาดบางชนิด ดังนั้นสคริปต์จึงสามารถจัดการความผิดพลาดแตกต่างกัน อย่างไรก็ตาม ในตัวอย่างนี้ เราตั้งใจที่จะใช้บรรณาธิการความผิดพลาดที่เราสร้างเองสำหรับความผิดพลาดทั้งหมด

set_error_handler("customError");

เนื่องจากเราอยากให้ฟังก์ชันที่เราสร้างเองเพื่อจัดการความผิดพลาดทั้งหมด set_error_handler() ต้องการตัวอุปกรณ์เพียงตัวเดียว แต่สามารถเพิ่มตัวอุปกรณ์ที่เลือกใช้เพื่อกำหนดระดับความผิดพลาด

ตัวอย่าง

ทดสอบประมวลผลข้อผิดพลาดนี้โดยการพยายามออกอากาศตัวแปรที่ไม่มีอยู่

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

ออกที่ของโค้ดดังกล่าวควรมีลักษณะเช่นนี้:

Error: [8] Undefined variable: test

กระตุ้นข้อผิดพลาด

มันเป็นสิ่งที่มีประโยชน์มากที่จะกระตุ้นข้อผิดพลาดในจุดที่ผู้ใช้ใส่ข้อมูลในสคริปต์ ขณะที่ข้อมูลที่ผู้ใช้ใส่ไม่ถูกต้อง ใน PHP งานนี้จะถูกทำโดยฟังก์ชัน trigger_error()

ตัวอย่าง

ในตัวอย่างนี้ ถ้าตัวแปร "test" มากกว่า "1" จะเกิดข้อผิดพลาด

<?php
$test=2;
if ($test>1)
{
trigger_error("ค่าต้องเป็น 1 หรือต่ำกว่า");
}
?>

ออกที่ของโค้ดดังกล่าวควรมีลักษณะเช่นนี้:

Notice: ค่าต้องเป็น 1 หรือต่ำกว่า
in C:\webfolder\test.php on line 6

คุณสามารถกระตุ้นข้อผิดพลาดในทุกจุดของสคริปต์ โดยการเพิ่มประมาณที่สอง คุณสามารถกำหนดระดับข้อผิดพลาดที่ต้องการ

ประเภทข้อผิดพลาดที่เป็นไปได้

  • E_USER_ERROR - ข้อผิดพลาด run-time ที่สร้างโดยผู้ใช้ที่เป็นอันตราย ข้อผิดพลาดไม่สามารถซ่อมแซมได้ การทำงานของสคริปต์ถูกหยุด
  • E_USER_WARNING - คำเตือน run-time ที่สร้างโดยผู้ใช้ที่ไม่เป็นอันตราย การทำงานของสคริปต์ไม่ถูกหยุด
  • E_USER_NOTICE - โดยมาตรฐาน การแจ้งเตือน run-time ที่สร้างโดยผู้ใช้ สคริปต์พบข้อผิดพลาดที่เป็นไปได้ และอาจเกิดขึ้นเมื่อสคริปต์ทำงานได้ดี

ตัวอย่าง

ในตัวอย่างนี้ ถ้าตัวแปร "test" มากกว่า "1" จะเกิดข้อผิดพลาด E_USER_WARNING ถ้าเกิดข้อผิดพลาด E_USER_WARNING เราจะใช้ประมวลผลข้อผิดพลาดที่เป็นของเราและหยุดสคริปต์

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "สิ้นสุดสคริปต์";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Value must be 1 or below",E_USER_WARNING);
 }
?>

ออกที่ของโค้ดดังกล่าวควรมีลักษณะเช่นนี้:

Error: [512] ค่าต้องเป็น 1 หรือต่ำกว่า
สิ้นสุดสคริปต์

ตอนนี้ เราได้เรียนรู้ว่าจะทำไม้เพื่อสร้าง error ของตัวเอง และว่าจะกระตุ้นพวกเขา ตอนนี้เราจะศึกษาบันทึกข้อผิดพลาด

บันทึกข้อผิดพลาด

โดยมาตรฐาน ตามการคอนฟิกิวเรชัน error_log ใน php.ini PHP จะส่งบันทึกข้อผิดพลาดไปยังระบบบันทึกข้อผิดพลาดของเซิร์ฟเวอร์หรือไฟล์ ด้วยการใช้ฟังก์ชัน error_log() คุณสามารถส่งบันทึกข้อผิดพลาดไปยังไฟล์หรือจุดหมายปลายทางที่เฉพาะอย่างยิ่ง

ส่งข้อความข้อผิดพลาดผ่านอีเมลล์ถึงตัวเองเอง คือวิธีที่ดีเพื่อได้รับการแจ้งเตือนข้อผิดพลาดที่เฉพาะอย่างยิ่ง

ส่งข้อความข้อผิดพลาดผ่าน E-Mail

ในตัวอย่างด้านล่าง ถ้ามีความผิดพลาดเฉพาะที่เกิดขึ้น จะส่งอีเมลที่มีข้อความผิดพลาดและจบสคริปต์ลง

<?php
//error handler function
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");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Value must be 1 or below",E_USER_WARNING);
 }
?>

ออกที่ของโค้ดดังกล่าวควรมีลักษณะเช่นนี้:

Error: [512] ค่าต้องเป็น 1 หรือต่ำกว่า
Webmaster ได้รับแจ้ง

อีเมลที่ได้รับมาจากโค้ดดังกล่าวมีลักษณะเช่นนี้:

Error: [512] ค่าต้องเป็น 1 หรือต่ำกว่า

วิธีนี้ไม่เหมาะสมสำหรับความผิดพลาดทั้งหมด ความผิดพลาดทั่วไปควรบันทึกลงบนเซิร์ฟเวอร์ด้วยการใช้ระบบบันทึกความผิดพลาดที่มาตรฐานของ PHP