บทช่วยสอน การจัดการข้อยกเว้น PHP ที่ดีที่สุดในปี 2024 ในบทช่วยสอนนี้ คุณสามารถเรียนรู้ อะไรคือสิ่งที่ผิดปกติ,ยกเว้นการใช้งานพื้นฐาน,ลองและจับโยน,ตัวอย่างอธิบาย:,สร้างคลาสยกเว้นที่กำหนดเอง,ตัวอย่างอธิบาย:,ข้อยกเว้นหลาย,ตัวอย่างอธิบาย:,Rethrows,ตัวอย่างอธิบาย:,ระดับบนสุดชุดการจัดการข้อยกเว้น,กฎข้อยกเว้น,
ข้อยกเว้นสำหรับการเปลี่ยนข้อผิดพลาดสคริปต์เกิดขึ้นเมื่อไหลปกติที่ระบุ
PHP 5 ข้อเสนอวิธีการใหม่สำหรับจัดการข้อผิดพลาดเชิงวัตถุ
การจัดการข้อยกเว้นจะใช้เมื่อเกิดข้อผิดพลาดที่ระบุ (ยกเว้น) เกิดขึ้นในการเปลี่ยนแปลงการไหลปกติของสคริปต์ สภาพนี้เรียกว่าเป็นข้อยกเว้น
เมื่อมีข้อยกเว้นจะถูกเรียกมักจะเกิดขึ้น:
เราจะแสดงวิธีการจัดการข้อผิดพลาดที่แตกต่างกัน
หมายเหตุ: ข้อยกเว้นควรใช้เฉพาะในกรณีที่มีข้อผิดพลาดก็ไม่ควรนำมาใช้ในจุดที่กำหนดเพื่อข้ามไปยังสถานที่อื่นในรหัส
เมื่อยกเว้นจะโยนรหัสที่ตามมาไม่ได้ดำเนินการต่อไป, PHP จะพยายามหาจับคู่ "จับ" บล็อก
หากมีข้อยกเว้นไม่ได้ถูกจับ แต่ไม่ได้มีการใช้ set_exception_handler (ที่) สำหรับการรักษาที่สอดคล้องกันแล้วข้อผิดพลาดร้ายแรง (ข้อผิดพลาดร้ายแรง) เกิดขึ้นและการส่งออก "Uncaught ข้อยกเว้น" (uncaught ข้อยกเว้น) ข้อความผิดพลาด
ลองโยนยกเว้น แต่ไม่ได้จับมัน:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } // 触发异常 checkNum(2); ?>
โค้ดข้างต้นจะได้รับข้อผิดพลาดที่คล้ายกันนี้:
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/w3big/test/test.php:7 Stack trace: #0 /www/w3big/test/test.php(13): checkNum(2) #1 {main} thrown in /www/w3big/test/test.php on line 7
เพื่อหลีกเลี่ยงข้อผิดพลาดที่ปรากฏในตัวอย่างข้างต้นเราต้องสร้างรหัสที่เหมาะสมในการจัดการกับข้อยกเว้น
รหัสข้อยกเว้นการจัดการที่เหมาะสมควรจะรวมถึง:
ขอเรียกข้อยกเว้น:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("变量值必须小于等于 1"); } return true; } // 在 try 块 触发异常 try { checkNum(2); // 如果抛出异常,以下文本不会输出 echo '如果输出该内容,说明 $number 变量'; } // 捕获异常 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>
รหัสข้างต้นจะได้รับข้อผิดพลาดเช่นนี้:
Message: 变量值必须小于等于 1
รหัสข้างต้นพ่นยกเว้นและจับมัน:
อย่างไรก็ตามในการที่จะปฏิบัติตาม "โยนทุกจะต้องสอดคล้องกับการจับหลักการ" คุณสามารถตั้งค่าการจัดการข้อยกเว้นระดับบนสุดที่จะจัดการกับข้อผิดพลาดที่ไม่ได้รับ
การสร้างจัดการข้อยกเว้นที่กำหนดเองเป็นเรื่องง่ายมาก เราเพียงแค่สร้างชั้นพิเศษเมื่อเกิดข้อยกเว้นใน PHP คุณสามารถเรียกฟังก์ชั่น ชั้นจะต้องเป็นส่วนหนึ่งของชั้นข้อยกเว้น
ชั้นยกเว้นที่กำหนดเองสืบทอดคุณลักษณะทั้งหมดที่กำหนดไว้ในระดับยกเว้น PHP, คุณอาจต้องการที่จะเพิ่มฟังก์ชั่นที่กำหนดเอง
เริ่มต้นด้วยการสร้างการเรียนการยกเว้น
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "someone@exampleth.com"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
คลาสใหม่นี้เป็นสำเนาของชนชั้นยกเว้นเก่าบวก errormessage () ฟังก์ชัน เพราะมันเป็นสำเนาของชนชั้นเก่าจึงสืบทอดจากคุณสมบัติชั้นเก่าและวิธีการที่เราสามารถใช้วิธีการเรียนการยกเว้นเช่น getline () getFile () และ getMessage ()
รหัสข้างต้นพ่นยกเว้นและผ่านระดับข้อยกเว้นที่กำหนดเองที่จะจับมัน
คุณสามารถใช้ข้อยกเว้นหลายคนเป็นสคริปต์เพื่อตรวจสอบความหลากหลายของสถานการณ์
คุณสามารถใช้บล็อกหลาย ifthelse หรือบล็อกการใช้รหัสหรือรังหลายข้อยกเว้น ข้อยกเว้นเหล่านี้สามารถใช้การเรียนการยกเว้นที่แตกต่างกันและกลับข้อความผิดพลาดที่แตกต่างกัน
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "someone@example.com"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { throw new Exception("$email 是 example 邮箱"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
รหัสข้างต้นการทดสอบสองเงื่อนไขถ้าคนใดคนหนึ่งสภาพไม่พอใจแล้วโยนข้อยกเว้น:
หากยกเว้นระดับ customException จะถูกโยนทิ้ง แต่ไม่ได้ติด customException จับเพียงข้อยกเว้นฐานที่จับข้อยกเว้น
บางครั้งเมื่อยกเว้นจะโยนคุณอาจต้องการที่จะแตกต่างจากวิธีมาตรฐานในการจัดการกับมัน อีกครั้งอาจจะโยนใน "จับ" บล็อก
สคริปต์ที่ควรจะซ่อนจากข้อผิดพลาดของระบบของผู้ใช้ สำหรับโปรแกรมเมอร์ข้อผิดพลาดของระบบอาจมีความสำคัญ แต่ผู้ใช้ไม่ได้สนใจในตัวเขา ที่จะทำให้มันง่ายขึ้นสำหรับผู้ที่จะใช้คุณสามารถโยนข้อยกเว้นอีกครั้งกับข้อความใช้ง่ายพอสมควร:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。'; return $errorMsg; } } $email = "someone@example.com"; try { try { // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new Exception($email); } } catch(Exception $e) { // 重新抛出异常 throw new customException($email); } } catch (customException $e) { // 显示自定义信息 echo $e->errorMessage(); } ?>
รหัสข้างต้นมีการตรวจพบใน e-mail address ถ้ามีสตริง "เช่น" ถ้ามีอีกครั้งยกเว้นจะโยน:
หากมีข้อยกเว้นไม่ได้ถูกจับในปัจจุบัน "ลอง" บล็อกจะมองหาจับบล็อกในระดับที่สูง
set_exception_handler () ฟังก์ชันที่สามารถตั้งค่าในการจัดการข้อยกเว้น uncaught ทั้งหมดของฟังก์ชั่นที่ผู้ใช้กำหนด
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
การส่งออกของโค้ดข้างต้นจะเป็นดังนี้:
Exception: Uncaught Exception occurred
ในรหัสข้างต้นไม่มี "จับ" บล็อก แต่ระดับบนสุดจัดการข้อยกเว้นเรียก ฟังก์ชั่นนี้ควรจะใช้ในการจับข้อยกเว้น uncaught ทั้งหมด
ในระยะสั้น: ถ้าคุณโยนยกเว้นคุณจะต้องจับมัน