ฟอรั่ม | ล่าสุดการพัฒนาเว็บบทเรียน
×

PHP เกี่ยวกับการสอน

PHP บ้าน PHP แนะนำ PHP ติดตั้ง PHP วากยสัมพันธ์ PHP ตัวแปร PHP Echo / พิมพ์ PHP ชนิดข้อมูล PHP เงื่อนไข PHP ค่าคงที่ PHP ผู้ประกอบการ PHP If...Else...Elseif PHP Switch PHP ในขณะที่ลูป PHP สำหรับลูป PHP ฟังก์ชั่น PHP แถว PHP เรียงลำดับอาร์เรย์ PHP Superglobals

PHP การจัดการ

PHP ฟอร์ม การจัดการ PHP ฟอร์ม การตรวจสอบ PHP ฟอร์ม จำเป็นต้องใช้ PHP ฟอร์ม URL/E-mail PHP ฟอร์ม สมบูรณ์

PHP สูง

PHP อาร์เรย์หลายมิติ PHP วันและเวลา PHP ประกอบด้วย PHP ไฟล์ การจัดการ PHP ไฟล์ เปิด / อ่าน PHP ไฟล์ สร้าง / เขียน PHP ไฟล์ อัปโหลด PHP Cookies PHP Sessions PHP ฟิลเตอร์ PHP Filters สูง PHP ผิดพลาด การจัดการ PHP ข้อยกเว้น

MySQL Database

MySQL ฐานข้อมูล MySQL สัมพันธ์ MySQL Create DB MySQL Create ตาราง MySQL Insert Data MySQL รับ ID เข้าครั้งสุดท้าย MySQL ใส่หลาย MySQL Prepared MySQL Select Data MySQL Delete Data MySQL Update Data MySQL Limit Data

PHP - XML

PHP XML parsers PHP SimpleXML Parser PHP SimpleXML - Get PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX แนะนำ AJAX PHP AJAX ฐานข้อมูล AJAX XML AJAX ค้นหาสด AJAX RSS Reader AJAX โพลล์

PHP Examples

PHP ตัวอย่าง PHP ทดสอบ PHP ใบรับรอง

PHP การอ้างอิง

PHP แถว PHP ปฏิทิน PHP วันที่ PHP ไดเรกทอรี PHP ผิดพลาด PHP ระบบแฟ้ม PHP กรอง PHP FTP PHP HTTP PHP Libxml PHP จดหมาย PHP คณิตศาสตร์ PHP อื่น ๆ PHP MySQLi PHP SimpleXML PHP เชือก PHP XML PHP Zip PHP ช่วงเวลา

 

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


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


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

ด้วย PHP 5 มาเป็นวิธีเชิงวัตถุใหม่ของการจัดการกับข้อผิดพลาด

การจัดการข้อยกเว้นใช้ในการเปลี่ยนการไหลปกติของการดำเนินรหัสถ้าข้อผิดพลาดที่ระบุ (พิเศษ) สภาพที่เกิดขึ้นThis condition is called an exception. สภาพนี้เรียกว่าเป็นข้อยกเว้น

นี่คือสิ่งที่เกิดขึ้นตามปกติเมื่อมีข้อยกเว้นจะถูกเรียก:

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

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

  • การใช้งานพื้นฐานของข้อยกเว้น
  • การสร้างจัดการข้อยกเว้นที่กำหนดเอง
  • ข้อยกเว้นหลาย
  • Re-ขว้างปายกเว้น
  • การตั้งค่าระดับบนสุดจัดการข้อยกเว้น

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


พื้นฐานของการใช้ข้อยกเว้น

เมื่อยกเว้นจะโยนรหัสต่อไปนี้ก็จะไม่ได้รับการดำเนินการและ PHP จะพยายามหาจับคู่ "จับ" บล็อก

หากมีข้อยกเว้นไม่ได้จับข้อผิดพลาดร้ายแรงจะออกด้วย "Uncaught ข้อยกเว้น" ข้อความ

ให้พยายามที่จะโยนข้อยกเว้นโดยไม่ต้องจับมัน

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception
checkNum(2);
?>

โค้ดข้างต้นจะได้รับข้อผิดพลาดเช่นนี้:

Fatal error : Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

ลองและจับโยน

เพื่อหลีกเลี่ยงข้อผิดพลาดจากตัวอย่างข้างต้นเราต้องสร้างโค้ดที่เหมาะสมในการจัดการข้อยกเว้น

รหัสข้อยกเว้นที่เหมาะสมควรจะรวมถึง:

  1. ลอง - ฟังก์ชั่นการใช้ข้อยกเว้นควรจะอยู่ใน "ลอง" บล็อกIf the exception does not trigger, the code will continue as normal. หากยกเว้นไม่เรียกรหัสจะยังคงเป็นปกติแต่ถ้าข้อยกเว้นเรียกข้อยกเว้นคือ "โยน"
  2. โยน - นี่คือวิธีการที่คุณเรียกข้อยกเว้นEach "throw" must have at least one "catch" แต่ละ "โยน" จะต้องมีอย่างน้อยหนึ่ง "จับ"
  3. จับ - จับ "" บล็อกดึงข้อยกเว้นและสร้างวัตถุที่มีข้อมูลข้อยกเว้น

ให้พยายามที่จะก่อให้เกิดข้อยกเว้นที่มีรหัสที่ถูกต้อง:

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception in a "try" block
try {
  checkNum(2);
  //If the exception is thrown, this text will not be shown
  echo 'If you see this, the number is 1 or below';
}

//catch exception
catch(Exception $e) {
  echo 'Message: ' .$e->getMessage();
}
?>

โค้ดข้างต้นจะได้รับข้อผิดพลาดเช่นนี้:

Message: Value must be 1 or below

ตัวอย่างอธิบายว่า:

รหัสข้างต้นพ่นยกเว้นและจับมัน:

  1. checkNum ฟังก์ชัน () จะถูกสร้างขึ้นIt checks if a number is greater than 1. If it is, an exception is thrown มันจะตรวจสอบว่าเป็นจำนวนที่มีค่ามากกว่า 1 ถ้ามันเป็นยกเว้นจะโยน
  2. checkNum () ฟังก์ชันที่เรียกว่าใน "ลอง" บล็อก
  3. ยกเว้นในกรณีที่ภายใน checkNum () ฟังก์ชั่นจะถูกโยนทิ้ง
  4. "การจับ" กระชากดึงข้อยกเว้นและสร้างวัตถุ ($ E) ที่มีข้อมูลข้อยกเว้น
  5. ข้อผิดพลาดจากการยกเว้นสะท้อนโดยการเรียก $ E-> getMessage () จากวัตถ​​ุข้อยกเว้น

อย่างไรก็ตามวิธีการหนึ่งที่จะได้รับรอบ "โยนทุกต้องมีการจับ" กฎคือการตั้งค่าการจัดการข้อยกเว้นระดับบนสุดที่จะจัดการกับข้อผิดพลาดที่ลื่นผ่าน


การสร้างชั้นยกเว้นที่กำหนดเอง

เพื่อสร้างจัดการข้อยกเว้นที่กำหนดเองคุณต้องสร้างชั้นเรียนพิเศษด้วยฟังก์ชั่นที่สามารถเรียกว่าเมื่อเกิดข้อยกเว้นใน PHPThe class must be an extension of the exception class. ชั้นจะต้องเป็นส่วนหนึ่งของชั้นข้อยกเว้น

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

ช่วยให้สร้างชั้นยกเว้น:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "someone@example...com";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

คลาสใหม่เป็นสำเนาของชนชั้นยกเว้นเก่าด้วยนอกเหนือจาก errormessage (ไม่) ฟังก์ชั่นSince it is a copy of the old class, and it inherits the properties and methods from the old class, we can use the exception class methods like getLine() and getFile() and getMessage(). เพราะมันเป็นสำเนาของชนชั้นเก่าและมันสืบทอดคุณสมบัติและวิธีการจากชั้นเก่าเราสามารถใช้วิธีการเรียนการยกเว้นเช่น getline () และ getFile () และ getMessage ()

ตัวอย่างอธิบายว่า:

รหัสข้างต้นพ่นยกเว้นและจับมันด้วยข้อยกเว้นระดับที่กำหนดเอง:

  1. customException () รุ่นที่จะถูกสร้างขึ้นเป็นส่วนขยายของชั้นยกเว้นเก่าThis way it inherits all methods and properties from the old exception class วิธีนี้จะสืบทอดวิธีการทั้งหมดและคุณสมบัติจากชั้นยกเว้นเก่า
  2. errormessage ฟังก์ชัน () จะถูกสร้างขึ้นThis function returns an error message if an e-mail address is invalid ฟังก์ชั่นนี้จะส่งกลับข้อผิดพลาดถ้าอีเมลไม่ถูกต้อง
  3. ตัวแปร $ อีเมลถูกตั้งค่าเป็นสตริงที่ไม่ใช่ที่อยู่อีเมลที่ถูกต้อง
  4. "ความพยายาม" บล็อกจะถูกดำเนินการและยกเว้นจะโยนตั้งแต่อีเมลไม่ถูกต้อง
  5. "การจับ" บล็อก catches ข้อยกเว้นและแสดงข้อความข้อผิดพลาด

ข้อยกเว้นหลาย

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

มันเป็นไปได้ที่จะใช้บล็อกหลาย if..else, สวิทช์หรือรังหลายข้อยกเว้นThese exceptions can use different exception classes and return different error messages: ข้อยกเว้นเหล่านี้สามารถใช้การเรียนการยกเว้นที่แตกต่างกันและกลับข้อความผิดพลาดที่แตกต่างกัน

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "someone@example.com";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
  //check for "example" in mail address
  if(strpos($email, "example") !== FALSE) {
    throw new Exception("$email is an example e-mail");
  }
}

catch (customException $e) {
  echo $e->errorMessage();
}

catch(Exception $e) {
  echo $e->getMessage();
}
?>

ตัวอย่างอธิบายว่า:

รหัสข้างต้นการทดสอบสองเงื่อนไขและพ่นยกเว้นถ้าเงื่อนไขใด ๆ จะไม่ได้พบกับ:

  1. customException () รุ่นที่จะถูกสร้างขึ้นเป็นส่วนขยายของชั้นยกเว้นเก่าThis way it inherits all methods and properties from the old exception class วิธีนี้จะสืบทอดวิธีการทั้งหมดและคุณสมบัติจากชั้นยกเว้นเก่า
  2. errormessage ฟังก์ชัน () จะถูกสร้างขึ้นThis function returns an error message if an e-mail address is invalid ฟังก์ชั่นนี้จะส่งกลับข้อผิดพลาดถ้าอีเมลไม่ถูกต้อง
  3. ตัวแปร $ อีเมลถูกตั้งค่าเป็นสตริงที่เป็นที่อยู่อีเมลที่ถูกต้อง แต่มีสตริง "เช่น"
  4. "ความพยายาม" บล็อกจะถูกดำเนินการและข้อยกเว้นไม่ได้ส่งออกไปบนเงื่อนไขแรก
  5. เงื่อนไขที่สองเรียกยกเว้นตั้งแต่อีเมลมีสตริง "ตัวอย่างที่"
  6. "การจับ" บล็อก catches ข้อยกเว้นและแสดงข้อความข้อผิดพลาดที่ถูกต้อง

หากข้อยกเว้นโยนเป็นของ customException ชั้นเรียนและไม่มีการจับ customException เพียงจับฐานข้อยกเว้นข้อยกเว้นจะได้รับการจัดการอย่างมี


Re-โยนข้อยกเว้น

บางครั้งเมื่อยกเว้นจะโยนคุณอาจต้องการที่จะจัดการกับมันแตกต่างจากวิธีการมาตรฐานIt is possible to throw an exception a second time within a "catch" block. มันเป็นไปได้ที่จะโยนยกเว้นเป็นครั้งที่สองภายใน "จับ" บล็อก

สคริปต์ควรซ่อนระบบผิดพลาดจากผู้ใช้System errors may be important for the coder, but are of no interest to the user. ข้อผิดพลาดของระบบอาจมีความสำคัญสำหรับ coder แต่เป็นที่สนใจของผู้ใช้ไม่มีที่จะทำให้สิ่งที่ง่ายสำหรับผู้ใช้ที่คุณสามารถ re-โยนข้อยกเว้นด้วยข้อความที่เป็นมิตรกับผู้ใช้:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
    return $errorMsg;
  }
}

$email = "someone@example.com";

try {
  try {
    //check for "example" in mail address
    if(strpos($email, "example") !== FALSE) {
      //throw exception if email is not valid
      throw new Exception($email);
    }
  }
  catch(Exception $e) {
    //re-throw exception
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

ตัวอย่างอธิบายว่า:

โค้ดข้างต้นการทดสอบถ้าอีเมล์ที่มีสตริง "เช่น" อยู่ในนั้นถ้ามันไม่ยกเว้นเป็นอีกครั้งที่โยน:

  1. customException () รุ่นที่จะถูกสร้างขึ้นเป็นส่วนขยายของชั้นยกเว้นเก่าThis way it inherits all methods and properties from the old exception class วิธีนี้จะสืบทอดวิธีการทั้งหมดและคุณสมบัติจากชั้นยกเว้นเก่า
  2. errormessage ฟังก์ชัน () จะถูกสร้างขึ้นThis function returns an error message if an e-mail address is invalid ฟังก์ชั่นนี้จะส่งกลับข้อผิดพลาดถ้าอีเมลไม่ถูกต้อง
  3. ตัวแปร $ อีเมลถูกตั้งค่าเป็นสตริงที่เป็นที่อยู่อีเมลที่ถูกต้อง แต่มีสตริง "เช่น"
  4. "ความพยายาม" บล็อกมีอีก "ลอง" บล็อกที่จะทำให้มันเป็นไปได้ที่จะกลับมาโยนข้อยกเว้น
  5. ยกเว้นในกรณีที่มีการเรียกตั้งแต่อีเมลมีสตริง "ตัวอย่างที่"
  6. "การจับ" บล็อก catches ข้อยกเว้นและ re-พ่น "customException"
  7. "การ customException" ถูกจับและแสดงข้อความผิดพลาด

หากยกเว้นไม่ได้ถูกจับในปัจจุบัน "ลอง" บล็อกก็จะหาจับบล็อกใน "ระดับที่สูงขึ้น"


ตั้งค่าการจัดการข้อยกเว้นระดับบนสุด

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

ในโค้ดข้างต้นไม่มี "จับ" บล็อกInstead, the top level exception handler triggered. แต่ระดับด้านบนจัดการข้อยกเว้นเรียกฟังก์ชั่นนี้ควรจะใช้ในการตรวจจับข้อยกเว้น uncaught


กฎข้อยกเว้น

  • รหัสอาจจะถูกล้อมรอบในบล็อกลองเพื่อช่วยจับข้อยกเว้นที่อาจเกิดขึ้น
  • แต่ละคนพยายามบล็อกหรือ "โยน" ต้องมีอย่างน้อยหนึ่งจับบล็อกที่สอดคล้องกัน
  • จับหลายบล็อกสามารถนำมาใช้ในการจับการเรียนแตกต่างกันของข้อยกเว้น
  • ข้อยกเว้นจะถูกโยน (หรืออีกครั้งโยน) ในการป้องกันการจับภายในบล็อกลอง

กฎง่าย: ถ้าคุณโยนสิ่งที่คุณจะต้องจับมัน