PHP Exception Handling

Ang exception (Exception) ay ginagamit upang baguhin ang normal na fluwido ng script kapag nangyari ang tinukoy na pagkakamali.

Ano ang exception?

Ang PHP 5 ay nagbibigay ng isang bagong pamamaraan ng paggamot sa error na ayon sa orientasyon sa object.

Ang paggamot sa exception ay ginagamit upang baguhin ang normal na fluwido ng script kapag nangyari ang tinukoy na pagkakamali (exception). Ito ay tinatawag na exception.

Kung nangyari ang exception, karaniwang nangyayari:

  • Ang kasalukuyang estado ng code ay ininimbak
  • Ang pagsasakatuparan ng code ay nililipat sa napredefinidong function ng handler ng exception
  • Ayon sa sitwasyon, ang handler ay maaaring magsimula ulit sa pinag-iimbak na estado ng code, tapusin ang pagsasakatuparan ng script, o magpatuloy sa ibang lugar ng code

Hinahayag namin ang iba't ibang pamamaraan ng paggamot sa pagkakamali:

  • Ang pangunahing paggamit ng exception
  • Lumikha ng sariling handler ng exception
  • Maraming kakaiba
  • Muling itulak ang kakaiba
  • I-set ang pinakamataas na handler ng exception

Ang pangunahing paggamit ng exception

Kung nangyari ang exception, ang mga sumunod na code ay hindi na magpapatuloy, ang PHP ay susubukan na hanapin ang pagkakasang-ayon na "catch" code block.

Kung ang exception ay hindi na na-catch at walang ginamit ang set_exception_handler() para sa pagtanggap ng pagtanggap, magiging parusa ang pagkakamali (matinding pagkakamali) at magpalabas ng mensahe ng pagkakamali "Uncaught Exception" (Hindi na na-catch na Exception).

Hilingin natin na itapon ang exception, ngunit huwag nang catch ito:

<?php
//lumikha ng function na may exception
//Lumikha ng function na maaaring itawag ng exception
 {
 function checkNum($number)
  {
  if($number>1)
  }
 throw new Exception("Ang halaga ay dapat 1 o mas mababa");
 }
//magtrigger ng exception
//Itatanggal ang exception sa loob ng "try" block
?>

Ang code na ito ay magiging parang ganitong pagkakamali:

Mga matinding pagkakamali: Hindi na na-catch na exception 'Exception' 
may mensahe 'Value must be 1 or below' sa C:\webfolder\test.php:6 
Stack trace: #0 C:\webfolder\test.php(12): 
checkNum(28) #1 {main} na itinala sa C:\webfolder\test.php sa linya 6

Try, throw at catch

Upang maiwasan ang pagkakaroon ng pagkakamali sa nakaraang halimbawa, kailangan naming lumikha ng tamang code upang pamahalaan ang kapansin-pansin.

Ang tamang programang dapat kasama ay:

  1. Subukahang - Ang paggamit ng kapansin-pansin na function ay dapat nasa loob ng bloke ng "try". Kung walang nangyari ang kapansin-pansin, ang code ay magpatuloy sa pagpapatuloy. Subalit kung nangyari ang kapansin-pansin, magiging parusa ang kapansin-pansin.
  2. Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
  3. Throw - Dito naitatalaga kung paano itatanggal ang exception. Bawat "throw" ay dapat may isang "catch"

Catch - Ang "catch" block ay magkakatanggap ng exception, at gumawa ng isang object na naglalaman ng impormasyon ng exception

<?php
Hayaan natin itatanggal ang isang exception:
//Lumikha ng function na maaaring itawag ng exception
 {
 function checkNum($number)
  {
  if($number>1)
  }
 throw new Exception("Ang halaga ay dapat 1 o mas mababa");
 }
return true;
try
 {
 //Itatanggal ang exception sa loob ng "try" block
 checkNum(2);
 //Kung itatanggal ang exception, ang teksto na ito ay hindi na ipapakita
 }
//Nakakatanggap ng exception
catch(Exception $e)
 {
 echo 'Mensahe: ' .$e->getMessage();
 }
?>

Ang mga kodong ito ay magkakaroon ng ganitong error:

Mensahe: Ang halaga ay dapat 1 o mas mababa

Talakayan ng halimbawa:

Ang mga kodong ito ay nagtawag ng exception at itinanggap ito:

  1. Lumikha ng function na checkNum(). Ito ay sumusuri kung ang numero ay mas malaki sa 1. Kung mayroon, itatanggal ang isang exception.
  2. Tawagan ang function na checkNum() sa loob ng "try" block.
  3. Ang exception sa function na checkNum() ay itinawag
  4. "Catch" block na nakakatanggap ng exception, at gumawa ng isang object na naglalaman ng impormasyon ng exception ($e)
  5. Sa pamamagitan ng pagtawag mula sa object ng exception, $e->getMessage(), na maglathala ng mensahe ng error mula sa exception

Gayunman, upang sundin ang prinsipyo ng "ang bawat throw ay dapat may isang catch", maaaring itakda ang isang pang-unang exception handler upang mahawakan ang nawawalang error.

Lumikha ng custom na klase ng Exception

Mainam ang paglikha ng custom na exception handler. Simple lang namin ang gumawa ng isang dedikadong klase, kapag mayroong exception sa PHP, maaaring itawag ang kanyang function. Ang klase na ito ay dapat na isang ekstensyon ng klase ng exception.

Ang custom na klase ng exception ay minamana ng lahat ng atrubuto ng klase ng exception ng PHP, maaaring idagdag mo ang iyong sariling function.

Amingdang nagsisimula ang paglikha ng klase ng exception:

<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  //mensahe ng error
  $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile();
  : <b>'.$this->getMessage().'</b> ay hindi isang wastong E-Mail address
  return $errorMsg;
  }
 }
$email = "someone@example...com";
try
 {
 //check if 
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  //ititira ang anomalya kung ang e-mail ay hindi wasto
  throw new customException($email);
  }
 }
catch (customException $e)
 {
 //ipakita ang personal na mensahe
 echo $e->errorMessage();
 }
?>

Ang bagong klase na ito ay isang kopya ng lumang klase ng exception, na mayroon pang function na errorMessage(). Dahil ito ay kopya ng lumang klase, ito ay inamin ng mga katangian at mga paraan ng lumang klase, at maaari naming gamitin ang mga paraan ng klase ng exception, tulad ng getLine(), getFile(), at getMessage().

Talakayan ng halimbawa:

Ang nakaraang code ay itulak ang kakaiba at inilagay ito sa ilalim ng isang custom na klase ng exception:

  1. Ang klase na customException() ay nilikha bilang isang pagpapalawak ng lumang klase ng exception. Sa ganito, ito ay minana ang lahat ng katangian at mga paraan ng lumang klase.
  2. Lumikha ng function na errorMessage(). Kung ang address ng e-mail ay hindi wasta, ang function na ito ay ibibigay ang mensahe ng error
  3. I-set ang variable ng $email sa hindi wastong string ng address ng e-mail
  4. I-execute ang "try" block ng code, dahil ang address ng e-mail ay hindi wasto, ito ay itulak ang kakaiba
  5. Ang "catch" block ng code ay mae-catch ang kakaiba at ipapakita ang mensahe ng error

Maraming kakaiba

Maaaring gamitin ang ilang kakaiba para sa isang script, upang suriin ang iba't ibang sitwasyon.

Maaaring gamitin ang ilang if..else block ng code, o isang switch block, o isang napakalaking napakalaking napakalaking napakalaking napakalaking napakalaking napakalaking napakalaking napakalaking block ng kakaiba. Ang mga kakaiba na ito ay maaaring gamitin ang iba't ibang klase ng exception at ibibigay ang iba't ibang mensahe ng error:

<?php
class customException extends Exception
{
public function errorMessage()
{
//mensahe ng error
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile();
: <b>'.$this->getMessage().'</b> ay hindi isang wastong E-Mail address
return $errorMsg;
}
}
$email = "someone@example.com";
try
 {
 //check if 
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
  {
  //ititira ang anomalya kung ang e-mail ay hindi wasto
  throw new customException($email);
  }
 //tignan kung may "example" sa address ng e-mail
 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();
 }
?>

Talakayan ng halimbawa:

Ang nakaraang code ay sinubukan ang dalawang kondisyon, kung ang anumang kondisyon ay hindi nagiging katotohanan, ito ay itulak ang kakaiba:

  1. Ang klase na customException() ay nilikha bilang isang pagpapalawak ng lumang klase ng exception. Sa ganito, ito ay minana ang lahat ng katangian at mga paraan ng lumang klase.
  2. Nilikha ang function na errorMessage(). Kung ang e-mail address ay hindi wasto, ang function na ito ay ibibigay ang isang mensahe ng error.
  3. I-execute ang "try" block ng code, kung walang kakaiba sa unang kondisyon, hindi ito itulak.
  4. Dahil ang e-mail ay may string na "example", ang ikalawang kondisyon ay mag-activate ng kakaiba.
  5. Ang "catch" block ng code ay mae-catch ang kakaiba at ipapakita ang naaangkop na mensahe ng error.

Kung hindi na-catch ang customException, at naka-catch lang ang base exception, i-process ang kakaiba doon.

Muling itulak ang kakaiba

Kung minsan, kapag mayroong kakaiba, maaring gusto mong gawin ito sa iba pang paraan kaysa sa standard. Maaaring muling itulak ang kakaiba sa isang "catch" block ng code.

Ang script ay dapat itago ang sistema ng error sa mga user. Maaaring mahalaga ang sistema ng error sa mga programer, ngunit hindi interesado ang mga user dito. Upang madaling gamitin ng mga user, maaaring ititira ang anomalya na may mensahe na mas friendly sa user:

<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  //mensahe ng error
  $errorMsg = $this->getMessage().' ay hindi isang wastong E-Mail address.';
  return $errorMsg;
  }
 }
$email = "someone@example.com";
try
 {
 try
  {
  //tignan kung may "example" sa address ng e-mail
  if(strpos($email, "example") !== FALSE)
   {
   //ititira ang anomalya kung ang e-mail ay hindi wasto
   throw new Exception($email);
   }
  }
 catch(Exception $e)
  {
  //muling ititira ang anomalya
  throw new customException($email);
  }
 }
catch (customException $e)
 {
 //ipakita ang personal na mensahe
 echo $e->errorMessage();
 }
?>

Talakayan ng halimbawa:

Ang ibabang kodigo ay naka detekta kung may string na "example" sa e-mail address. Kung mayroon, ito ay muling ititira ang anomalya:

  1. Ang klase na customException() ay nilikha bilang isang pagpapalawak ng lumang klase ng exception. Sa ganito, ito ay minana ang lahat ng katangian at mga paraan ng lumang klase.
  2. Nilikha ang function na errorMessage(). Kung ang e-mail address ay hindi wasto, ang function na ito ay ibibigay ang isang mensahe ng error.
  3. I-set ang variable na $email sa isang wastong e-mail address, ngunit may string na "example".
  4. Ang bloke ng "try" ay naglalaman ng isa pang bloke ng "try", upang muling ititira ang anomalya.
  5. Dahil ang e-mail ay naglalaman ng string na "example", ito ay nagpa-activate ng anomalya.
  6. "catch" ay nakakuha ng anomalya at muling ititira ang "customException".
  7. Nakakuha ang "customException" at ipakita ang isang mensahe ng error.

If an exception is not caught in its current 'try' code block, it will look for a catch block at a higher level.

Set Top-Level Exception Handler

The set_exception_handler() function can set a user-defined function to handle all uncaught exceptions.

<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>

The output of the above code should be similar to this:

Exception: Uncaught Exception occurred

In the above code, there is no 'catch' block, but the top-level exception handling program is triggered. This function should be used to catch all uncaught exceptions.

Rules of Exceptions

  • Code that needs to handle exceptions should be placed inside a try block to catch potential exceptions.
  • Each try or throw block must have at least one corresponding catch block.
  • Using multiple catch blocks can catch different types of exceptions.
  • Exceptions can be re-thrown (re-thrown) within the catch block of the try code block.

In short: If an exception is thrown, it must be caught.