PHP ການຈັດການຂໍ້ບັນຫາອອກສົບພາບ
- ການໄປຫລັງ PHP Error
- ການໄປຕໍ່ຫລັງ PHP Filter
Exception (Exception) ແມ່ນວິທີຈັດການຄວາມຜິດໃນທີ່ມີການເກີດຄວາມຜິດ.
ຫຍັງວ່າສົ່ງຂໍ້ບັນຫາ?
PHP 5 ສະໜອງວິທີຈັດການຄວາມຜິດໃນທິດສະດີທາງເປັນລະຫວ່າງປະເທດ.
ການຈັດການຄວາມຜິດ (Exception) ແມ່ນການປ່ຽນສິ່ງປະຕິບັດຂອງຄຳກຳລັງຫຼັງຈາກມີການເກີດຄວາມຜິດ (Exception).
ຖ້າມີການສົ່ງຂໍ້ບັນຫາ, ປະຈຸບັນຈະເກີດການ:
- ສະຖານະຄະດີວິທີການຈະຖືກບັນທຶກ
- ຄຳກຳລັງຈະຖືກຫັນໄປຫາວິທີຈັດການຂໍ້ບັນຫາທີ່ກໍານົດຄຽງໄວ້
- ອີງຕາມສະພາບ, ໄດ້ທາງທີ່ຈະສືບຕໍ່ເຮັດຄຳກຳລັງຈາກສະຖານະຄະດີວິທີການບັນທຶກ, ຢຸດຕິການເຮັດຄຳກຳລັງຫຼັກ, ຫຼືສືບຕໍ່ເຮັດຄຳກຳລັງຈາກສະຖານະບັນທຶກອື່ນໆ
ພວກເຮົາຈະສະແດງວິທີຈັດການຄວາມຜິດຕ່າງໆ:
- ການນຳໃຊ້ຂອງຂໍ້ບັນຫາຢູ່ບໍລິຫານພາບດີ
- ການສ້າງຜູ້ຈັດການຂໍ້ບັນຫາສ້າງຕົວເອງ
- ສິ່ງຜິດພາດຫຼາຍ
- ປ່ອຍສິ່ງຜິດພາດອີກຄັ້ງ
- ການຈັດການຂໍ້ບັນຫາຂັ້ນສູງສຸດ
ການນຳໃຊ້ຂອງຂໍ້ບັນຫາຢູ່ບໍລິຫານພາບດີ
ຖ້າມີການສົ່ງຂໍ້ບັນຫາ, ຄຳກຳລັງຫຼັງຈາກນັ້ນຈະບໍ່ສືບຕໍ່ເຮັດ, PHP ຈະພະຍາຍາມຄົ້ນຫາ "catch" ວັດຖຸທີ່ຕ້ອງການ.
ຖ້າບໍ່ມີການກັບການຄວາມຜິດ ແລະ ບໍ່ໃຊ້ set_exception_handler() ເພື່ອຈັດການ, ຈະເກີດຄວາມຜິດຮຸນແຮງ (ຄວາມຜິດຫຼັງ) ແລະ ສົ່ງຂໍ້ບັນຫາ "Uncaught Exception" (Exception ບໍ່ໄດ້ກັບຄວາມຜິດ).
ພວກເຮົາຈະບັນທຶກການສົ່ງຂໍ້ບັນຫາ, ຖ້າບໍ່ຈະກັບການກັບຄວາມຜິດ.
<?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
Try, throw ແລະ catch
ເພື່ອຫຼີກລ່ຽງຄວາມຜິດທີ່ປະກົດຂຶ້ນໃນຕົວຢ່າງນີ້, ພວກເຮົາຕ້ອງສ້າງວິທີການທີ່ຖືກຕ້ອງເພື່ອຈັດການຂໍ້ບັນຫາ.
ຜູ້ຄວບຄຸມທີ່ຖືກຕ້ອງຕ້ອງກວມ:
- Try - ການນຳໃຊ້ຫົວຫຼັກທີ່ບໍ່ປອດໄພຕ້ອງຢູ່ໃນການເອົາ "try" ວັດຖຸ. ຖ້າບໍ່ມີການສົ່ງຂໍ້ບັນຫາ, ຄຳກຳລັງຈະສືບຕໍ່ເຮັດ. ແຕ່ຖ້າການສົ່ງຂໍ້ບັນຫາຖືກສົ່ງອອກ, ຈະສົ່ງຂໍ້ບັນຫາອອກ.
- Throw - ການປະຕິບັດຕາມການປ່ອຍອອກພິການ. ແຕ່ລະ "throw" ຕ້ອງມີ "catch" ຢ່າງໜ້ອຍຫນຶ່ງ
- Catch - "catch" 代码块ຈະຈັບພິການ ແລະ ສ້າງລັດສະນະຂອງພິການທີ່ວັດຈາກ
ພວກເຮົາຈະປ່ອຍອອກພິການ:
<?php //ສ້າງຫົວຂໍ້ທີ່ສາມາດປ່ອຍອອກພິການ function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //ການປ່ອຍອອກພິການໃນຫົວຂໍ້ "try" 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 $e) { echo 'Message: ' .$e->getMessage(); } ?>
ລະບຽບຂອງລະບົບທີ່ຈະອອກມີຂໍ້ບັນຫາຄືກັນ:
Message: Value must be 1 or below
ຄວາມຄິດທີ່ຈະອະທິບາຍ:
ລະບຽບຂອງລະບົບທີ່ປ່ອຍອອກພິການ ແລະ ກັບການຈັບພິການ
- ສ້າງຫົວຂໍ້ checkNum() ທີ່ກວດສອບຈຳນວນວ່າຫຼາຍກວ່າ 1. ຖ້າຫຼາຍກວ່າ 1, ຈະປ່ອຍອອກພິການ.
- ການໂຊກຫົວຂໍ້ checkNum() ໃນຫົວຂໍ້ "try"
- ພິການໃນຫົວຂໍ້ checkNum() ຈະຖືກປ່ອຍອອກ
- "catch" 代码块ຈະຮັບພິການນັ້ນ ແລະ ສ້າງລັດສະນະຂອງພິການ ($e).
- ການໂຊກ $e->getMessage() ຈາກລັດສະນະ exception ຈະອອກອາກາດຂໍ້ຄວາມຂອງພິການ.
ແຕ່ເພື່ອປະຕິບັດຕາມຄຳລະບຸ "ທຸກ throw ຕ້ອງມີ catch ຕາມນັ້ນ" ທີ່ທ່ານສາມາດຕັ້ງການຄວບຄຸມພິການທີ່ຫຼຸດຫຼາຍລົງສູ່ຂັ້ນຕົ້ນຂອງລະບົບ.
ສ້າງປະເພດ Exception ທີ່ຕາມຄຳລະບຸຂອງພິການ
ສ້າງປະເພດ exception ທີ່ຕາມຄຳລະບຸຂອງພິການຂອງພວກເຮົາອາດເປັນຢ່າງງ່າຍຂອບ. ພວກເຮົາສ້າງປະເພດອັນສະດຸນທີ່ພິການຖືກເອິ້ນບໍ່ດົນນານານຸດ. ປະເພດນັ້ນຕ້ອງເປັນການຂະຫຍາຍຂອງປະເພດ exception.
ປະເພດ exception ທີ່ໄດ້ຮັບຜິດຊອບຈາກປະເພດ exception PHP ທັງໝົດຂອງຄຳພິການທີ່ທ່ານສາມາດເພີ່ມພິການສຳລັບຕົວຕອນຂອງພວກເຂົາ.
ພວກເຮົາເລີ່ມສ້າງປະເພດ exception:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile(); : <b>'.$this->getMessage().'</b> ບໍ່ແມ່ນທີ່ຢູ່ສຳພັນ 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(); } ?>
ນັ້ນແມ່ນປະກອບຂອງນວຍມາດ exception ທີ່ເກີດຂື້ນອັນດັບກ່ອນ ພ້ອມກັບຫນັງ errorMessage() ທີ່ມີຫນັງທີ່ມີມາດຂອງນວຍມາດທີ່ເກີດຂື້ນອັນດັບກ່ອນ. ຍ້ອນວ່າມັນແມ່ນປະກອບຂອງນວຍມາດທີ່ເກີດຂື້ນອັນດັບກ່ອນ ມັນຈະຕ້ອງສາຍມາມາດ ແລະ ວິທີຂອງນວຍມາດທີ່ເກີດຂື້ນອັນດັບກ່ອນ. ທ່ານສາມາດໃຊ້ວິທີຂອງ exception ເຊັ່ນ getLine() , getFile() ແລະ getMessage().
ຄວາມຄິດທີ່ຈະອະທິບາຍ:
ການດຳເນີນວິທິຜິດພາດທີ່ຖືກຈັບຕົວໂດຍນວຍມາດ exception ທີ່ສ້າງຂຶ້ນອັນດັບນີ້:
- ຫົວຫນ້າ customException() ຖືກສ້າງຂື້ນເປັນການຂະຫຍາຍຈາກຫົວຫນ້າ exception ທີ່ເກົ່າ. ດັ່ງນັ້ນມັນຈະຮັບມອບທັງທັງສິນລະພາບ ແລະ ວິກິດຂອງຫົວຫນ້າເກົ່າທັງໝົດ.
- ການສ້າງຫນັງ errorMessage() ທີ່ຖ້າ e-mail address ບໍ່ຖືກກວດກາຫນັງ ຫນັງຈະສະແດງຂໍ້ບັນຫາບັນຫາ
- ການປ່ອຍ $email ຄືກັບຄວາມສະແຫຼງບັນຫາ e-mail address ບໍ່ຖືກກວດກາຫນັງ
- ການດຳເນີນ "try" 代码块 ຍ້ອນວ່າທີ່ຢູ່ສຳພັນ e-mail address ບໍ່ຖືກກວດກາຫນັງ ຈະປ່ອຍສິ່ງຜິດພາດ.
- ການຈັດການ "catch" ຈະຈັບການຜິດພາດ ແລະ ສະແດງຂໍ້ບັນຫາບັນຫາ
ສິ່ງຜິດພາດຫຼາຍ
ທ່ານສາມາດໃຊ້ສິ່ງຜິດພາດຫຼາຍບ່ອນໃຫ້ການສະແດງບັນຫາຫຼາຍບັນຫາ.
ທ່ານສາມາດໃຊ້ການຈັດການ if..else ຫຼາຍບ່ອນ ຫຼື ການຈັດການ switch ຫຼາຍບ່ອນ ຫຼື ການປົກຄອງສິ່ງຜິດພາດຫຼາຍບ່ອນ. ສິ່ງຜິດພາດທັງໝົດຈະໃຊ້ນວິທິ exception ທີ່ຕ່າງກັນ ແລະ ສະແດງຂໍ້ບັນຫາບັນຫາທີ່ຕ່າງກັນ:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile(); : <b>'.$this->getMessage().'</b> ບໍ່ແມ່ນທີ່ຢູ່ສຳພັນ 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(); } ?>
ຄວາມຄິດທີ່ຈະອະທິບາຍ:
ການດຳເນີນວິທິການທີ່ກ່າວກ່ອນ ການດຳເນີນວິທິ "try" ທີ່ຈະປ່ອຍສິ່ງຜິດພາດຖ້າບໍ່ມີຂໍ້ກໍານົດທັງສອງ.
- ຫົວຫນ້າ customException() ຖືກສ້າງຂື້ນເປັນການຂະຫຍາຍຈາກຫົວຫນ້າ exception ທີ່ເກົ່າ. ດັ່ງນັ້ນມັນຈະຮັບມອບທັງທັງສິນລະພາບ ແລະ ວິກິດຂອງຫົວຫນ້າເກົ່າທັງໝົດ.
- ສ້າງຫົວຫນ້າ errorMessage() ວິກິດຂັດ. ຖ້າທີ່ອີເມວບໍ່ມີຄວາມມັນກຳນົດ ຫົວຫນ້ານັ້ນຈະກັບຄືນຂໍ້ບັນຫາຜິດພາດດຽວກັນ.
- ການດຳເນີນ "try" 代码块 ໃນເງື່ອນທີ່ທັງສອງຂໍ້ກໍານົດບໍ່ສາມາດຈະປ່ອຍສິ່ງຜິດພາດ.
- ຍ້ອນວ່າ e-mail ມີສິ່ງ "example" ການຕອບກັບຂໍ້ກໍານົດສອງຈະຖືກຈັບຕົວ.
- ການຈັດການ "catch" ຈະຈັບການຜິດພາດ ແລະ ສະແດງຂໍ້ບັນຫາບັນຫາທີ່ເໝາະສົມ.
ຖ້າບໍ່ມີການຈັບການ customException ແລະພຽງແຕ່ຈັບການ base exception ໃນຫນ່ວຍນັ້ນ ທ່ານຈະຈັດການບັນຫາຢູ່ນັ້ນ.
ປ່ອຍສິ່ງຜິດພາດອີກຄັ້ງ
ບາງຄັ້ງ ເມື່ອມີສິ່ງຜິດພາດຖືກປ່ອຍອອກ ທ່ານອາດຢາກໃຊ້ວິທີການຈັດການບັນຫາທີ່ບໍ່ແມ່ນວິທີຈັດການບັນຫາທີ່ມັກ. ທ່ານສາມາດປ່ອຍສິ່ງຜິດພາດອີກຄັ້ງໃນ ການຈັດການ "catch".
ການຫຼີ້ນສະບັບຄວາມຜິດພາດຂອງລະບົບຄວນຫຼີ້ນຫຼາຍກວ່າຜູ້ນຳການປະຕິບັດ. ຄວາມຜິດພາດຂອງລະບົບຈະມີຄວາມສໍາຄັນສຳລັບຜູ້ນຳການປະຕິບັດ ແຕ່ຜູ້ນຳການບໍ່ມີຄວາມສໍາຄັນຕໍ່ພວກມັນ. ເພື່ອໃຫ້ຜູ້ນຳການຫຼີ້ນຫຼາຍກວ່າຫຼາຍ ມັນສາມາດປ່ອຍສະພາບຜິດພາດທີ່ມີຄວາມສົມທົບຕໍ່ຜູ້ນຳການອີກຄັ້ງ:
<?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(); } ?>
ຄວາມຄິດທີ່ຈະອະທິບາຍ:
ວິກາກກ່າວກ່າວກັບທີ່ຈະກວດກາວ່າມີສະເພາະ "example" ໃນທີ່ຢູ່ທີ່ອີເມວ. ຖ້າມີມັນຈະສະແດງສະພາບຜິດພາດອີກຄັ້ງ:
- ຫົວຫນ້າ customException() ຖືກສ້າງຂື້ນເປັນການຂະຫຍາຍຈາກຫົວຫນ້າ exception ທີ່ເກົ່າ. ດັ່ງນັ້ນມັນຈະຮັບມອບທັງທັງສິນລະພາບ ແລະ ວິກິດຂອງຫົວຫນ້າເກົ່າທັງໝົດ.
- ສ້າງຫົວຫນ້າ errorMessage() ວິກິດຂັດ. ຖ້າທີ່ອີເມວບໍ່ມີຄວາມມັນກຳນົດ ຫົວຫນ້ານັ້ນຈະກັບຄືນຂໍ້ບັນຫາຜິດພາດດຽວກັນ.
- ກະຕຸ້ມ $email ກັບທີ່ຢູ່ທີ່ອີເມວທີ່ມີຄວາມມັນກຳນົດ ແຕ່ມີສະເພາະ "example"。
- ວິກາກ "try" ກວມມີ "try" ອີກຄັ້ງໃນບາງບັນທຶກວິກາກ ເພື່ອສະແດງສະພາບຜິດພາດອີກຄັ້ງ。
- ຍ້ອນທີ່ອີເມວມີສະເພາະ "example" ວ່າມັນຈະສະແດງສະພາບຜິດພາດ。
- "catch" ກັບເອົາສະພາບຜິດພາດດຽວກັນ ແລະ ປ່ອຍສະພາບ "customException" ອີກຄັ້ງ。
- ກັບເອົາ "customException" ແລະ ສະແດງຂໍ້ບັນຫາຜິດພາດດຽວກັນ。
如果在其目前的 "try" 代码块中异常没有被捕获,则它将在更高层级上查找 catch 代码块。
ການການກັບຄືນສະຖານະອັນຕະລາຍຂັ້ນສູງສຸດ
set_exception_handler() 函数ສາມາດການການກັບຄືນການສະຖານະອັນຕະລາຍທີ່ບໍ່ໄດ້ຖືກກັບຄືນຂອງຜູ້ນໍາໃຊ້.
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
ການສະແດງຂອງລະຫັດການທີ່ກ່າວກ່ອນຄືດັ່ງກ່າວ:
Exception: Uncaught Exception occurred
ໃນລະຫັດການລະບຸບທີ່ກ່າວກ່ອນ, ບໍ່ມີ catch 代码块, ແຕ່ມີການກະຕຸ້ນຄວາມສະຖານະອັນຕະລາຍທີ່ສູງສຸດ. ຄວນໃຊ້ການລະບຸບນີ້ເພື່ອກັບຄືນສະຖານະອັນຕະລາຍທີ່ບໍ່ໄດ້ຖືກກັບຄືນ.
ກົດລະບຽບສະຖານະອັນຕະລາຍ
- ການກັບຄືນສະຖານະອັນຕະລາຍຄວນຈະຢູ່ໃນການກັບຄືນ try 代码块, ເພື່ອກັບຄືນສະຖານະອັນຕະລາຍທີ່ອາດເກີດຂຶ້ນ.
- ແລະການກັບຄືນ try ຫລື throw 代码块ຕ້ອງມີ catch 代码块ທີ່ຕົກລົງຢ່າງຫນຶ່ງ.
- ການໃຊ້ catch 代码块ຫລາຍກວ່າຫນຶ່ງສາມາດກັບຄືນສະຖານະອັນຕະລາຍຫລາຍຊະນິດ.
- ສາມາດປາກົດສະຖານະອັນຕະລາຍໃນການກັບຄືນ catch 代码块 ທີ່ຢູ່ໃນການກັບຄືນ try 代码块.
ສະໂລທີ: ຖ້າມີການປາກົດສະຖານະອັນຕະລາຍ, ຕ້ອງຈະກັບຄືນມັນ.
- ການໄປຫລັງ PHP Error
- ການໄປຕໍ່ຫລັງ PHP Filter