ตัวอย่าง PHP Try Catch: บทช่วยสอนการจัดการข้อยกเว้นและข้อผิดพลาด

ข้อยกเว้นคืออะไร?

ข้อผิดพลาดคือผลลัพธ์ของโปรแกรมที่ไม่คาดคิดซึ่งตัวโปรแกรมเองไม่สามารถจัดการได้

ข้อผิดพลาดได้รับการแก้ไขโดยการแก้ไขโปรแกรม ตัวอย่างของข้อผิดพลาดอาจเป็นการวนซ้ำไม่สิ้นสุดที่ไม่เคยหยุดดำเนินการ

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

ตัวอย่างของข้อยกเว้น ได้แก่ การพยายามเปิดไฟล์ที่ไม่มีอยู่

ข้อยกเว้นนี้สามารถจัดการได้โดยการสร้างไฟล์หรือให้ผู้ใช้มีตัวเลือกในการค้นหาไฟล์

ทำไมต้องจัดการกับข้อยกเว้น?

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

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

เมื่อเกิดข้อผิดพลาด ขึ้นอยู่กับการตั้งค่าคอนฟิกูเรชันของคุณ PHP แสดงข้อความแสดงข้อผิดพลาดในเว็บเบราว์เซอร์พร้อมข้อมูลเกี่ยวกับข้อผิดพลาดที่เกิดขึ้น

PHP เสนอวิธีจัดการกับข้อผิดพลาดหลายวิธี

เราจะดูวิธีการที่ใช้กันทั่วไปสาม (3) วิธี;

  1. คำสั่งตาย– ฟังก์ชัน die รวมฟังก์ชัน echo และ exit ไว้ในที่เดียว มันมีประโยชน์มากเมื่อเราต้องการส่งข้อความและหยุดการทำงานของสคริปต์เมื่อเกิดข้อผิดพลาด
  2. ตัวจัดการข้อผิดพลาดแบบกำหนดเอง – เป็นฟังก์ชันที่ผู้ใช้กำหนดซึ่งจะถูกเรียกเมื่อใดก็ตามที่เกิดข้อผิดพลาด
  3. รายงานข้อผิดพลาด PHP – ข้อความแสดงข้อผิดพลาดขึ้นอยู่กับการตั้งค่าการรายงานข้อผิดพลาด PHP ของคุณ วิธีนี้มีประโยชน์มากในสภาพแวดล้อมการพัฒนาเมื่อคุณไม่ทราบว่าอะไรเป็นสาเหตุของข้อผิดพลาด ข้อมูลที่แสดงสามารถช่วยให้คุณดีบักแอปพลิเคชันของคุณได้

ข้อผิดพลาดในการจัดการตัวอย่าง

ตอนนี้เรามาดูตัวอย่างง่ายๆ กับรูทีนการจัดการข้อผิดพลาดกัน

สมมติว่าเราได้พัฒนาแอปพลิเคชันที่ใช้ไฟล์ข้อความในการจัดเก็บข้อมูล เราอาจต้องการตรวจสอบการมีอยู่ของไฟล์ก่อนที่จะพยายามอ่านข้อมูลจากไฟล์นั้น

รหัสด้านล่างใช้ตัวอย่างข้างต้น

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

สมมติว่าคุณบันทึกไฟล์ simple_error.php ในโฟลเดอร์ phptuts ให้เปิด URL http://localhost/phptuts/simple_error.php

คุณจะได้รับผลลัพธ์ดังต่อไปนี้

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

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

เราจะแก้ไขโค้ดด้านบนและเขียนตัวจัดการข้อผิดพลาดสำหรับแอปพลิเคชัน

<?php
$denominator = 0;
if ($denominator != 0) {
    echo 2 / $denominator;
} else {
    echo "cannot divide by zero (0)";
}
?>

สมมติว่าคุณบันทึกโค้ดด้านบนเป็น error_handling.php ให้เปิด URL http://localhost/phptuts/error_handling.php

ตัวจัดการข้อยกเว้น PHP ใน PHP

หมายเหตุ ถือเป็นแนวทางปฏิบัติรักษาความปลอดภัยที่ดีที่จะแสดงข้อความตามที่แสดงด้านบนแทนที่จะแสดงข้อความว่า "ไม่พบไฟล์"

ลองดูอีกตัวอย่างหนึ่งที่ใช้ตัวจัดการข้อผิดพลาดแบบกำหนดเอง

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

รหัสด้านล่างแสดงให้เห็นถึงการดำเนินการตามตัวอย่างข้างต้น

<?php
function my_error_handler($error_no, $error_msg)
{
    echo "Opps, something went wrong:";
    echo "Error number: [$error_no]";
    echo "Error Description: [$error_msg]";
}
set_error_handler("my_error_handler");
echo (5 / 0);
?>

เปิด URL http://localhost/phptuts/custom_error_handler.php คุณจะได้รับผลลัพธ์ดังต่อไปนี้

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


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

  • ช่วยให้เราปรับแต่งข้อความแสดงข้อผิดพลาดได้
  • ตัวจัดการข้อผิดพลาดแบบกำหนดเองยังสามารถรวมการบันทึกข้อผิดพลาดในไฟล์/ฐานข้อมูล การส่งอีเมลถึงนักพัฒนา เป็นต้น

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

<?php
error_reporting($reporting_level);
?>

ที่นี่

  • “error_reporting” เป็นฟังก์ชันการรายงานข้อผิดพลาดของ PHP
  • “$reporting_level” เป็นทางเลือก ซึ่งสามารถใช้เพื่อกำหนดระดับการรายงานได้ หากไม่มีการระบุระดับการรายงาน PHP จะใช้ระดับการรายงานข้อผิดพลาดเริ่มต้นตามที่ระบุไว้ในไฟล์ php.ini
ระดับการรายงาน Descriptไอออน ตัวอย่าง
E_คำเตือน แสดงข้อความเตือนเท่านั้น ไม่หยุดการทำงานของสคริปต์ error_reporting(E_WARNING);
E_ข้อสังเกต แสดงการแจ้งเตือนที่อาจเกิดขึ้นระหว่างการทำงานของโปรแกรมตามปกติหรืออาจเป็นข้อผิดพลาด error_reporting(E_ ประกาศ);
E_USER_ERROR แสดงข้อผิดพลาดที่ผู้ใช้สร้างขึ้น เช่น ตัวจัดการข้อผิดพลาดแบบกำหนดเอง error_reporting(E_ USER_ERROR);
E_USER_WARNING แสดงข้อความเตือนที่ผู้ใช้สร้างขึ้น error_reporting(E_USER_WARNING);
E_USER_ประกาศ แสดงประกาศที่ผู้ใช้สร้างขึ้น error_reporting(E_USER_NOTICE);
E_RECOVERABLE_ERROR แสดงข้อผิดพลาดที่ไม่ร้ายแรงและสามารถจัดการได้โดยใช้ตัวจัดการข้อผิดพลาดแบบกำหนดเอง error_reporting(E_RECOVERABLE_ERROR);
อี_ออล แสดงข้อผิดพลาดและคำเตือนทั้งหมด error_reporting(E_ ทั้งหมด);

ความแตกต่างระหว่างข้อผิดพลาดและข้อยกเว้น

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

ตารางด้านล่างแสดงวิธีการของวัตถุข้อยกเว้น

วิธี Descriptไอออน ตัวอย่าง
getMessage () แสดงข้อความข้อยกเว้น
<?php
echo $e->getMessage();
?>
รับโค้ด() แสดงรหัสตัวเลขที่แสดงถึงข้อยกเว้น
<?php
echo $e->getCode();
?>
รับไฟล์() แสดงชื่อไฟล์และเส้นทางที่เกิดข้อยกเว้น
<?php
echo $e->getFile();
?>
รับสาย() แสดงหมายเลขบรรทัดที่เกิดข้อยกเว้น
<?php
echo $e->getLine();
?>
รับการติดตาม() แสดงอาร์เรย์ของ backtrace ก่อนข้อยกเว้น
<?php
print_r( $e->getTrace());
?>
รับก่อนหน้า() แสดงข้อยกเว้นก่อนหน้านี้ก่อนข้อยกเว้นปัจจุบัน
<?php
echo $e->getPrevious();
?>
getTraceAsString() แสดง backtrace ของข้อยกเว้นเป็นสตริงแทนที่จะเป็นอาร์เรย์
<?php
echo $e->getTraceAsString();
?>
__toString() แสดงข้อยกเว้นทั้งหมดเป็นสตริง
<?php
echo $e->__toString();
?>


ด้านล่างนี้เป็นรูปแบบพื้นฐานในการโยนข้อยกเว้น

<?php
throw new Exception("This is an exception example");
?>

ที่นี่

  • “throw” เป็นคำสำคัญที่ใช้เพื่อทิ้งข้อยกเว้น
  • “ข้อยกเว้นใหม่(…)” สร้างวัตถุข้อยกเว้นและส่งสตริง “นี่คือตัวอย่างข้อยกเว้น “ เป็นพารามิเตอร์ข้อความ

โค้ดด้านบนจะแสดงข้อความต่อไปนี้

ตัวจัดการข้อยกเว้น PHP ใน PHP

ตอนนี้เราจะดูตัวอย่างที่ใช้การโยนและจับข้อยกเว้น

เราจะแก้ไขตัวอย่างข้างต้นและรวมการลอง โยน และจับ

มีโครงสร้างพื้นฐานดังต่อไปนี้

<?php
try {
    //code goes here that could potentially throw an exception
}
catch (Exception $e) {
    //exception handling code goes here
}
?>

ที่นี่

  • “try{…}” คือบล็อกของโค้ดที่จะดำเนินการซึ่งอาจก่อให้เกิดข้อยกเว้น
  • “catch(Exception $e){…}” คือบล็อกของโค้ดที่จับข้อยกเว้นที่ถูกส่งออกมาและกำหนดวัตถุข้อยกเว้นให้กับตัวแปร $e

โค้ดด้านล่างแสดงตัวอย่างข้อยกเว้นพื้นฐานพร้อมการใช้ข้อยกเว้น try, Throw และ catch

โปรแกรมจงใจส่งข้อยกเว้นซึ่งโปรแกรมจะตรวจจับได้

<?php
try {
    $var_msg = "This is an exception example";
    throw new Exception($var_msg);
}
catch (Exception $e) {
    echo "Message: " . $e->getMessage();
    echo "";
    echo "getCode(): " . $e->getCode();
    echo "";
    echo "__toString(): " . $e->__toString();
}
?>

เปิด URL http://localhost/phptuts/exception_handling.php คุณจะได้รับผลลัพธ์ดังต่อไปนี้

ตัวจัดการข้อยกเว้น PHP ใน PHP

นอกจากนี้ยังสามารถสร้างข้อยกเว้นได้หลายรายการสำหรับคำสั่ง php try หนึ่งคำสั่ง ขึ้นอยู่กับประเภทของข้อยกเว้นที่ถูกส่งออกไป

ดูบทความเกี่ยวกับ MySQL, การเข้าถึงข้อมูล PHP... สำหรับตัวอย่างการใช้งานที่มีข้อยกเว้นหลายรายการ

ข้อยกเว้นหลายประการ

ข้อยกเว้นหลายรายการใช้บล็อก try catch หลายบล็อกเพื่อจัดการกับข้อยกเว้นที่ถูกส่งออกมา ข้อยกเว้นหลายประการจะมีประโยชน์เมื่อ;

  • คุณต้องการแสดงข้อความที่กำหนดเองโดยขึ้นอยู่กับข้อยกเว้นที่เกิดขึ้น
  • คุณต้องการดำเนินการที่ไม่ซ้ำกันขึ้นอยู่กับข้อยกเว้นที่ถูกโยน

ผังงานด้านล่างแสดงวิธีการทำงานของข้อยกเว้นหลายรายการ

ข้อยกเว้นหลายประการ

ลองดูตัวอย่างที่ใช้ข้อยกเว้นหลายรายการ

เราจะแก้ไขโค้ดที่หารตัวเลขด้วยตัวส่วนที่ส่งผ่าน

เราคาดว่าจะมีข้อยกเว้นสองประเภทเกิดขึ้น

  • การหารด้วยศูนย์
  • หารด้วยจำนวนลบ

เพื่อความเรียบง่าย เราจะแสดงเฉพาะประเภทข้อยกเว้นในบล็อก catch ของเราเท่านั้น

PHP ที่สร้างขึ้นในคลาส Exception ใช้เพื่อส่งข้อยกเว้น

เราจะสร้างสองคลาสที่ขยายคลาสข้อยกเว้นและใช้เพื่อโยนข้อยกเว้น

รหัสด้านล่างแสดงการใช้งาน

<?php
class DivideByZeroException extends Exception {};
class DivideByNegativeException extends Exception {};
function process($denominator)
{
	try
	{
		if ($denominator == 0)
		{
			throw new DivideByZeroException();
		}
		else if ($denominator < 0)
		{
			throw new DivideByNegativeException();
		}
		else
		{
			echo 25 / $denominator;
		}
	}
	catch (DivideByZeroException $ex)
	{
		echo "DIVIDE BY ZERO EXCEPTION!";
	}
	catch (DivideByNegativeException $ex)
	{
		echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!";
	}
	catch (Exception $x)
	{
	echo "UNKNOWN EXCEPTION!";
	}
}
process(0);
?>

การทดสอบรหัส

เราจะถือว่าคุณได้บันทึก multiple_Exceptions.php ไว้ในโฟลเดอร์ phptuts

เรียกดู URL http://localhost/phptuts/multiple_exceptions.php

ตัวจัดการข้อยกเว้น PHP ใน PHP

สลับกลับไปที่ไฟล์ PHP และส่ง -1 เป็นพารามิเตอร์ตามที่แสดงในแผนภาพต่อไปนี้

ตัวจัดการข้อยกเว้น PHP ใน PHP

เรียกดู URL http://localhost/phptuts/multiple_exceptions.php.

คุณได้ผลลัพธ์อะไรบ้าง? ส่งผ่าน 3 เป็นพารามิเตอร์

คุณได้ผลลัพธ์อะไรบ้าง?

สรุป

  • ข้อผิดพลาดคือผลลัพธ์ที่ไม่คาดคิดที่เกิดจากโค้ด PHP
  • การจัดการข้อผิดพลาดช่วยปรับปรุงประสิทธิภาพของแอปพลิเคชัน
  • PHP มีฟังก์ชันในตัวที่สามารถใช้เพื่อปรับแต่งวิธีที่ PHP รายงานข้อผิดพลาดได้
  • ข้อยกเว้นก็เหมือนกับข้อผิดพลาด แต่สามารถตรวจจับได้โดยใช้ catch block เมื่อโยนทิ้ง
  • การแสดงข้อความแสดงข้อผิดพลาดที่แสดงข้อมูลข้อผิดพลาดถือเป็นแนวทางปฏิบัติด้านความปลอดภัยที่ไม่ดี