ตัวอย่าง PHP Try Catch: บทช่วยสอนการจัดการข้อยกเว้นและข้อผิดพลาด
ข้อยกเว้นคืออะไร?
ข้อผิดพลาดคือผลลัพธ์ของโปรแกรมที่ไม่คาดคิดซึ่งตัวโปรแกรมเองไม่สามารถจัดการได้
ข้อผิดพลาดได้รับการแก้ไขโดยการแก้ไขโปรแกรม ตัวอย่างของข้อผิดพลาดอาจเป็นการวนซ้ำไม่สิ้นสุดที่ไม่เคยหยุดดำเนินการ
ข้อยกเว้นคือผลลัพธ์ของโปรแกรมที่ไม่คาดคิดซึ่งตัวโปรแกรมเองสามารถจัดการได้
ตัวอย่างของข้อยกเว้น ได้แก่ การพยายามเปิดไฟล์ที่ไม่มีอยู่
ข้อยกเว้นนี้สามารถจัดการได้โดยการสร้างไฟล์หรือให้ผู้ใช้มีตัวเลือกในการค้นหาไฟล์
ทำไมต้องจัดการกับข้อยกเว้น?
- หลีกเลี่ยงผลลัพธ์ที่ไม่คาดคิดบนหน้าเว็บของเราซึ่งอาจสร้างความรำคาญหรือระคายเคืองต่อผู้ใช้ปลายทางของเรา
- ปรับปรุงความปลอดภัยของแอปพลิเคชันของเราโดยไม่เปิดเผยข้อมูลที่ผู้ใช้ที่เป็นอันตรายอาจใช้เพื่อโจมตีแอปพลิเคชันของเรา
- Php Exceptions ใช้เพื่อเปลี่ยนโฟลว์ปกติของโปรแกรมหากเกิดข้อผิดพลาดที่คาดเดาได้
การจัดการข้อผิดพลาด PHP
เมื่อเกิดข้อผิดพลาด ขึ้นอยู่กับการตั้งค่าคอนฟิกูเรชันของคุณ PHP แสดงข้อความแสดงข้อผิดพลาดในเว็บเบราว์เซอร์พร้อมข้อมูลเกี่ยวกับข้อผิดพลาดที่เกิดขึ้น
PHP เสนอวิธีจัดการกับข้อผิดพลาดหลายวิธี
เราจะดูวิธีการที่ใช้กันทั่วไปสาม (3) วิธี;
- คำสั่งตาย– ฟังก์ชัน die รวมฟังก์ชัน echo และ exit ไว้ในที่เดียว มันมีประโยชน์มากเมื่อเราต้องการส่งข้อความและหยุดการทำงานของสคริปต์เมื่อเกิดข้อผิดพลาด
- ตัวจัดการข้อผิดพลาดแบบกำหนดเอง – เป็นฟังก์ชันที่ผู้ใช้กำหนดซึ่งจะถูกเรียกเมื่อใดก็ตามที่เกิดข้อผิดพลาด
- รายงานข้อผิดพลาด PHP – ข้อความแสดงข้อผิดพลาดขึ้นอยู่กับการตั้งค่าการรายงานข้อผิดพลาด PHP ของคุณ วิธีนี้มีประโยชน์มากในสภาพแวดล้อมการพัฒนาเมื่อคุณไม่ทราบว่าอะไรเป็นสาเหตุของข้อผิดพลาด ข้อมูลที่แสดงสามารถช่วยให้คุณดีบักแอปพลิเคชันของคุณได้
ข้อผิดพลาดในการจัดการตัวอย่าง
ตอนนี้เรามาดูตัวอย่างง่ายๆ กับรูทีนการจัดการข้อผิดพลาดกัน
สมมติว่าเราได้พัฒนาแอปพลิเคชันที่ใช้ไฟล์ข้อความในการจัดเก็บข้อมูล เราอาจต้องการตรวจสอบการมีอยู่ของไฟล์ก่อนที่จะพยายามอ่านข้อมูลจากไฟล์นั้น
รหัสด้านล่างใช้ตัวอย่างข้างต้น
<?php $denominator = 0; echo 2 / $denominator; ?>
สมมติว่าคุณบันทึกไฟล์ simple_error.php ในโฟลเดอร์ phptuts ให้เปิด URL http://localhost/phptuts/simple_error.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 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 คุณจะได้รับผลลัพธ์ดังต่อไปนี้
ดังที่คุณเห็นจากตัวอย่างข้างต้น ตัวจัดการข้อผิดพลาดแบบกำหนดเองมีประสิทธิภาพในแง่นั้น
- ช่วยให้เราปรับแต่งข้อความแสดงข้อผิดพลาดได้
- ตัวจัดการข้อผิดพลาดแบบกำหนดเองยังสามารถรวมการบันทึกข้อผิดพลาดในไฟล์/ฐานข้อมูล การส่งอีเมลถึงนักพัฒนา เป็นต้น
ตอนนี้มาดูการจัดการข้อผิดพลาดประเภทที่สามกัน เราจะใช้ฟังก์ชัน 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 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 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 และส่ง -1 เป็นพารามิเตอร์ตามที่แสดงในแผนภาพต่อไปนี้
เรียกดู URL http://localhost/phptuts/multiple_exceptions.php.
คุณได้ผลลัพธ์อะไรบ้าง? ส่งผ่าน 3 เป็นพารามิเตอร์
คุณได้ผลลัพธ์อะไรบ้าง?
สรุป
- ข้อผิดพลาดคือผลลัพธ์ที่ไม่คาดคิดที่เกิดจากโค้ด PHP
- การจัดการข้อผิดพลาดช่วยปรับปรุงประสิทธิภาพของแอปพลิเคชัน
- PHP มีฟังก์ชันในตัวที่สามารถใช้เพื่อปรับแต่งวิธีที่ PHP รายงานข้อผิดพลาดได้
- ข้อยกเว้นก็เหมือนกับข้อผิดพลาด แต่สามารถตรวจจับได้โดยใช้ catch block เมื่อโยนทิ้ง
- การแสดงข้อความแสดงข้อผิดพลาดที่แสดงข้อมูลข้อผิดพลาดถือเป็นแนวทางปฏิบัติด้านความปลอดภัยที่ไม่ดี