PHP အမှား ကန့်သတ်

异常(Exception)用于在指定的错误发生时改变脚本的正常流程。

什么是异常?

PHP 5 提供了一种新的面向对象的错误处理方法。

异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。

当异常被触发时,通常会发生:

  • 当前代码状态被保存
  • 代码执行被切换到预定义的异常处理器函数
  • 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本

我们将展示不同的错误处理方法:

  • 异常的基本使用
  • 创建自定义的异常处理器
  • အခြား အကြောင်းကြောင်း
  • အကြောင်းကြောင်း ပြန်ဖြစ်ပေါ်လာမှု
  • 设置顶层异常处理器

异常的基本使用

当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块。

如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught 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;
 }
//In the "try" block, trigger an exception
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() အရာဝတ္တု ကို ဖွင့်ပေးပြီ။ ထို အရာဝတ္တု သည် နှစ် ၁ ထက် မြင့်သော နည်းပါး ကို စစ်ဆေးပြီး အမှားသတ်မှတ်ခြင်း ကို ဖြေဖျောက်သည်
  2. "try" အရာဝတ္တု အချက်အလက် တွင် checkNum() အရာဝတ္တု ကို ခေါ်ဆိုပြီ
  3. checkNum() အရာဝတ္တု အမှားသတ်မှတ်ခြင်း ဖြင့် ဖြေဖျောက်သည်
  4. "catch" အရာဝတ္တု အချက်အလက် သည် ထို အမှားသတ်မှတ်ခြင်း ကို ဖြတ်တောက်ပြီး အမှားသတ်မှတ်ခြင်း အချက်အလက် ကို ပေးပို့သည် ($e)
  5. ထို exception အရာဝတ္တု ကို ခေါ်ဆိုပြီး $e->getMessage() ကို အားပေးသော အမှားသတ်မှတ်ခြင်း အား ပြန်လည်ပေးပြီ

သို့သော် 'အမှားသတ်မှတ်ခြင်း နှင့် အမှားသတ်မှတ်ခြင်း အတူ ပြတ်တောက်သည်' သဘောတူ ကို လိုက်နာရန် အမှားသတ်မှတ်ခြင်း အပေါ်အခြေခံ အမှားသတ်မှတ်ခြင်း အရာဝတ္တု ကို ဖွင့်ပေးရမည်။ ထို အမှားသတ်မှတ်ခြင်း အရာဝတ္တု သည် အမှားသတ်မှတ်ခြင်း အား ဖွင့်ပေးရမည့် အမှားသတ်မှတ်ခြင်း အား ဖွင့်ပေးရမည်။

အမှားသတ်မှတ်ခြင်း အမှားသတ်မှတ်ခြင်း အရာဝတ္တု ကို ဖွင့်ပေးပြီ

အမှားသတ်မှတ်ခြင်း အပြုအမူ ကို ဖွင့်ပေးရမည့် အသံထွက် အမှားသတ်မှတ်ခြင်း အရာဝတ္တု ကို အသံထွက် ပြီး အမှားသတ်မှတ်ခြင်း အရာဝတ္တု အား ကူးသတ်မှတ်ခြင်း အရာဝတ္တု အား ဖွင့်ပေးရမည့် အရာဝတ္တု အား ဖွင့်ပေးရမည်။ ထို အရာဝတ္တု သည် အမှားသတ်မှတ်ခြင်း အရာဝတ္တု အား ဖွင့်ပေးရမည့် အရာဝတ္တု အား ဖွင့်ပေးရမည်။

ထို ကိုကူးသတ်မှတ်ခြင်း အမှားသတ်မှတ်ခြင်း သည် PHP အမှားသတ်မှတ်ခြင်း အရာဝတ္တု အား ခံယူသည် ဖြစ်ပြီး သင် သူ့ ကိုယ်တိုင် အမှားသတ်မှတ်ခြင်း အရာဝတ္တု ကို ထပ်ပေးနိုင်ပါသည်。

ကျွန်တော်မှာ အမှားသတ်မှတ်ခြင်း ကို ဖွင့်ပေးပြီ:

<?php
class customException extends Exception
 {
 public function errorMessage()
  {
  //error message
  $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
  : <b>'.$this->getMessage().'</b> မဟုတ် မည်သည် မဟုတ် သူ အမှား အိမ်မှာ အမှား မြန်မာ အရေး
  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() အမျိုးအစား က အရေးပေါ် အမျိုးအစား ကို အဆိုပါ အမျိုးအစား က ဖွဲ့စည်းခဲ့ ပြီး အရေးပေါ် အမျိုးအစား က အားလုံး အချက်အလက် နှင့် လုပ်ငန်း ကို သွင်းလုပ်ခဲ့သည်。
  2. 创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一条错误消息
  3. 把 $email 变量设置为不合法的 e-mail 地址字符串
  4. try အုပ်ချုပ်စက် တစ်ခု အပါအဝင် လုပ်ဆောင်ပြီး အမှား အိမ်မှာ အမှား ဖြစ်သော် အကြောင်းကြောင်း ဖြစ်ပေါ်လာဘူး
  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> မဟုတ် မည်သည် မဟုတ် သူ အမှား အိမ်မှာ အမှား မြန်မာ အရေး
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() အမျိုးအစား က အရေးပေါ် အမျိုးအစား ကို အဆိုပါ အမျိုးအစား က ဖွဲ့စည်းခဲ့ ပြီး အရေးပေါ် အမျိုးအစား က အားလုံး အချက်အလက် နှင့် လုပ်ငန်း ကို သွင်းလုပ်ခဲ့သည်。
  2. errorMessage() လုပ်ငန်း ကို ဖန်တီးခဲ့ပြီး အိမ်ရှယ်လိုင်း မပြည့်စုံသော ကြောင်း အမှား သတင်းစကား တစ်ခု ပြန်လည် ပြန်ပေးခဲ့သည်。
  3. try အုပ်ချုပ်စက် တစ်ခု အပါအဝင် လုပ်ဆောင်ပြီး အခြေခံ အခြေအနေ မရှိဘဲ အကြောင်းကြောင်း ဖြစ်ပေါ်လာဘူး
  4. e-mail တွင် "example" ကဲ့သို့ အချက်အလက် ရှိသော် ဒုတိယ အခြေအနေ ကို ဖြစ်ပေါ်လာမှု ဖြစ်ပါတယ်
  5. "catch" အုပ်ချုပ်စက် ဖြင့် အကြောင်းကြောင်း ဖမ်းဆည်းပြီး အခြေအနေ ကြောင်း အမှား ဖော်ပြမယ်

customException ကို ဖမ်းဆည်းခြင်း မရှိဘဲ အခြေခံ အကြောင်းကြောင်း ဖမ်းဆည်းခြင်း သာ ရှိသော် အမှား ကို ထိုနေရာ တွင် ပြုပြင်ပါ။

အကြောင်းကြောင်း ပြန်ဖြစ်ပေါ်လာမှု

တောင်းကြိုးတားမှုတစ်ခု ဖြစ်ပေါ်လာခဲ့တော့ သော်လည်း ၊ သင်သည် အခြား အထိရိုး ဖြင့် ထိန့်ချုပ်ချင်တယ် ဆိုတာက ကျွန်ုပ်သည် အသင့် ကို ဖြေရှင်းလိမ့်မယ်။ "catch" အုပ်ချုပ်စက် တစ်ခု တွင် တစ်ကြိမ်ထက်ပို အကြောင်းကြောင်း ဖြစ်ပေါ်လာမယ်။

script က အသုံးပြုသူ ကို အချက်အလက် အရေးပေါ် ကို အားပေးလိုက်သည်။ အော်ဒိပ် အတွက် အချက်အလက် အရေးပေါ် က အများဆုံး အရေးကြီး ဖြစ်နိုင် သော်လည်း အသုံးပြုသူ က သိပ်လိုက် မရှိပေ။ အသုံးပြုသူ ကို အနှစ်နှစ် အောင်မြင် အောင် အသုံးပြုနိုင် အောင် အရေးပေါ် ကို အသုံးပြုသူ က ပြန်ပေးလိုက် သော အမှား သတင်းစကား ကို ပြန်ပေးလိုက် သင့်ပါသည်:

<?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() အမျိုးအစား က အရေးပေါ် အမျိုးအစား ကို အဆိုပါ အမျိုးအစား က ဖွဲ့စည်းခဲ့ ပြီး အရေးပေါ် အမျိုးအစား က အားလုံး အချက်အလက် နှင့် လုပ်ငန်း ကို သွင်းလုပ်ခဲ့သည်。
  2. errorMessage() လုပ်ငန်း ကို ဖန်တီးခဲ့ပြီး အိမ်ရှယ်လိုင်း မပြည့်စုံသော ကြောင်း အမှား သတင်းစကား တစ်ခု ပြန်လည် ပြန်ပေးခဲ့သည်。
  3. $email ပုံစံ က အရေးပါ အိမ်ရှယ်လိုင်း ကို သတ်မှတ်ခဲ့သည် သို့မဟုတ် အချက် "example" ကို ပါဝင်သည်。
  4. "try" အုပ်စု အရေးပေါ် က အခြား "try" အုပ်စု ကို ပါဝင်သည် အတွက် အရေးပေါ် ပြန်ပေးခဲ့သည်。
  5. e-mail က အချက် "example" ကို ပါဝင်သောကြောင့် အရေးပေါ် ဖြစ်ပေါ်ခဲ့သည်。
  6. "catch" က ထိုအရေးပေါ် စစ်ဆေးခဲ့ ပြီး အရေးပေါ် "customException" ကို ပြန်ပေါ်ပေးခဲ့သည်。
  7. ထို "customException" ကို စစ်တမ်းချက် တစ်ခု ပြုလုပ်ခဲ့ပြီး အမှား သတင်းစကား တစ်ခု ပြုလုပ်ခဲ့သည်。

如果在其目前的 "try" 代码块中异常没有被捕获,则它将在更高层级上查找 catch 代码块。

设置顶层异常处理器 (Top Level Exception Handler)

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

အမှား ပေါ်ပေါးခြင်းကို ပြန်ဖျန်းရန် အရေးယူခြင်း သင့် အခန်းကဏ္ဍ ကို ကျန်းမားစေရန် လုပ်ဆောင်သင့်၍ ပေါ်ပေါးသည်。

အမှား အခြေခံ

  • အမှား ပေါ်ပေါးခြင်းကို ပြန်ဖျန်းရန် အရေးယူခြင်း သင့် အခန်းကဏ္ဍ ကို ကျန်းမားစေရန် လုပ်ဆောင်သင့်၍ ပေါ်ပေါးသည်。
  • အမှား ပေါ်ပေါးခြင်းကို ပြန်ဖျန်းရန် အရေးယူခြင်း သင့် အခန်းကဏ္ဍ ကို ကျန်းမားစေရန် လုပ်ဆောင်သင့်၍ ပေါ်ပေါးသည်。
  • အမှား အမျိုးမျိုး ကို ပြန်ဖျန်းခြင်း ပြုနိုင်သည်。
  • try အခန်းကဏ္ဍ အတွင်း အမှား ပြန်ဖျန်း (re-thrown) ကျန်းမားစေရန် နိုင်သည်。

ပုံပေါင်းများစွာကို ရိုက်သိမ်းရန် သင့် အခါ၌ အမှား ပေါ်ပေါ်ခြင်းကို ကျန်းမားစေရန် လုပ်ဆောင်သင့်၍ ပေါ်ပေါ်သည်။