PHP ການຈັດການຂໍ້ບັນຫາອອກສົບພາບ

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

ເພື່ອຫຼີກລ່ຽງຄວາມຜິດທີ່ປະກົດຂຶ້ນໃນຕົວຢ່າງນີ້, ພວກເຮົາຕ້ອງສ້າງວິທີການທີ່ຖືກຕ້ອງເພື່ອຈັດການຂໍ້ບັນຫາ.

ຜູ້ຄວບຄຸມທີ່ຖືກຕ້ອງຕ້ອງກວມ:

  1. Try - ການນຳໃຊ້ຫົວຫຼັກທີ່ບໍ່ປອດໄພຕ້ອງຢູ່ໃນການເອົາ "try" ວັດຖຸ. ຖ້າບໍ່ມີການສົ່ງຂໍ້ບັນຫາ, ຄຳກຳລັງຈະສືບຕໍ່ເຮັດ. ແຕ່ຖ້າການສົ່ງຂໍ້ບັນຫາຖືກສົ່ງອອກ, ຈະສົ່ງຂໍ້ບັນຫາອອກ.
  2. Throw - ການປະຕິບັດຕາມການປ່ອຍອອກພິການ. ແຕ່ລະ "throw" ຕ້ອງມີ "catch" ຢ່າງໜ້ອຍຫນຶ່ງ
  3. 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

ຄວາມຄິດທີ່ຈະອະທິບາຍ:

ລະບຽບຂອງລະບົບທີ່ປ່ອຍອອກພິການ ແລະ ກັບການຈັບພິການ

  1. ສ້າງຫົວຂໍ້ checkNum() ທີ່ກວດສອບຈຳນວນວ່າຫຼາຍກວ່າ 1. ຖ້າຫຼາຍກວ່າ 1, ຈະປ່ອຍອອກພິການ.
  2. ການໂຊກຫົວຂໍ້ checkNum() ໃນຫົວຂໍ້ "try"
  3. ພິການໃນຫົວຂໍ້ checkNum() ຈະຖືກປ່ອຍອອກ
  4. "catch" 代码块ຈະຮັບພິການນັ້ນ ແລະ ສ້າງລັດສະນະຂອງພິການ ($e).
  5. ການໂຊກ $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 ທີ່ສ້າງຂຶ້ນອັນດັບນີ້:

  1. ຫົວຫນ້າ customException() ຖືກສ້າງຂື້ນເປັນການຂະຫຍາຍຈາກຫົວຫນ້າ exception ທີ່ເກົ່າ. ດັ່ງນັ້ນມັນຈະຮັບມອບທັງທັງສິນລະພາບ ແລະ ວິກິດຂອງຫົວຫນ້າເກົ່າທັງໝົດ.
  2. ການສ້າງຫນັງ errorMessage() ທີ່ຖ້າ e-mail address ບໍ່ຖືກກວດກາຫນັງ ຫນັງຈະສະແດງຂໍ້ບັນຫາບັນຫາ
  3. ການປ່ອຍ $email ຄືກັບຄວາມສະແຫຼງບັນຫາ e-mail address ບໍ່ຖືກກວດກາຫນັງ
  4. ການດຳເນີນ "try" 代码块 ຍ້ອນວ່າທີ່ຢູ່ສຳພັນ e-mail address ບໍ່ຖືກກວດກາຫນັງ ຈະປ່ອຍສິ່ງຜິດພາດ.
  5. ການຈັດການ "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" ທີ່ຈະປ່ອຍສິ່ງຜິດພາດຖ້າບໍ່ມີຂໍ້ກໍານົດທັງສອງ.

  1. ຫົວຫນ້າ customException() ຖືກສ້າງຂື້ນເປັນການຂະຫຍາຍຈາກຫົວຫນ້າ exception ທີ່ເກົ່າ. ດັ່ງນັ້ນມັນຈະຮັບມອບທັງທັງສິນລະພາບ ແລະ ວິກິດຂອງຫົວຫນ້າເກົ່າທັງໝົດ.
  2. ສ້າງຫົວຫນ້າ errorMessage() ວິກິດຂັດ. ຖ້າທີ່ອີເມວບໍ່ມີຄວາມມັນກຳນົດ ຫົວຫນ້ານັ້ນຈະກັບຄືນຂໍ້ບັນຫາຜິດພາດດຽວກັນ.
  3. ການດຳເນີນ "try" 代码块 ໃນເງື່ອນທີ່ທັງສອງຂໍ້ກໍານົດບໍ່ສາມາດຈະປ່ອຍສິ່ງຜິດພາດ.
  4. ຍ້ອນວ່າ e-mail ມີສິ່ງ "example" ການຕອບກັບຂໍ້ກໍານົດສອງຈະຖືກຈັບຕົວ.
  5. ການຈັດການ "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" ໃນທີ່ຢູ່ທີ່ອີເມວ. ຖ້າມີມັນຈະສະແດງສະພາບຜິດພາດອີກຄັ້ງ:

  1. ຫົວຫນ້າ customException() ຖືກສ້າງຂື້ນເປັນການຂະຫຍາຍຈາກຫົວຫນ້າ exception ທີ່ເກົ່າ. ດັ່ງນັ້ນມັນຈະຮັບມອບທັງທັງສິນລະພາບ ແລະ ວິກິດຂອງຫົວຫນ້າເກົ່າທັງໝົດ.
  2. ສ້າງຫົວຫນ້າ errorMessage() ວິກິດຂັດ. ຖ້າທີ່ອີເມວບໍ່ມີຄວາມມັນກຳນົດ ຫົວຫນ້ານັ້ນຈະກັບຄືນຂໍ້ບັນຫາຜິດພາດດຽວກັນ.
  3. ກະຕຸ້ມ $email ກັບທີ່ຢູ່ທີ່ອີເມວທີ່ມີຄວາມມັນກຳນົດ ແຕ່ມີສະເພາະ "example"。
  4. ວິກາກ "try" ກວມມີ "try" ອີກຄັ້ງໃນບາງບັນທຶກວິກາກ ເພື່ອສະແດງສະພາບຜິດພາດອີກຄັ້ງ。
  5. ຍ້ອນທີ່ອີເມວມີສະເພາະ "example" ວ່າມັນຈະສະແດງສະພາບຜິດພາດ。
  6. "catch" ກັບເອົາສະພາບຜິດພາດດຽວກັນ ແລະ ປ່ອຍສະພາບ "customException" ອີກຄັ້ງ。
  7. ກັບເອົາ "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 代码块.

ສະໂລທີ: ຖ້າມີການປາກົດສະຖານະອັນຕະລາຍ, ຕ້ອງຈະກັບຄືນມັນ.