PHP异常处理教程

108 阅读4分钟

PHP异常处理

异常是由于程序的意外结果而导致的程序执行正常流程的中断。异常基本上就像典型的编程错误。然而,与标准错误不同,异常可以由程序本身来处理。

前提条件

读者应具备以下知识才能跟上这篇文章的进度。

  • 初学者对[PHP编程语言]的理解。
  • 初学者对一般编程的理解。

异常处理简介

异常处理是指对程序运行时发生的错误的处理,通常在所有程序中都是一样的。当错误发生时,异常处理会改变程序的流程。这些错误通常被称为异常。

以下是在PHP中处理异常时使用的关键词。

试试

这是输入可能出现异常的代码的块。如果代码在运行过程中出现了异常,则在catch块中捕获并纠正该异常。try block 通常与finallycatch 块一起使用。一个try块通常与程序中的一个或多个catch块一起使用。

捕获

每当PHP程序的try block中抛出一个异常,catch block 中的代码就会被执行,以试图处理这个异常。catch block 不能单独存在。相反,它与try block 一起工作。

抛出

throw关键字用于抛出PHP程序中的异常。它也允许列出所有由特定函数抛出的、不能被处理的异常。throw关键字不能在没有catch block 的情况下使用。

最后

finally block 是用于PHP的清理活动。这个块包含了代码的核心部分,并负责其执行。这个块可以作为一个catch block ,即使异常没有被处理,也会一直执行。

下面是异常处理过程中的事件流的示意图。

diagram

触发异常时发生的事件

每当在程序运行期间触发了一个异常,就会发生以下事件。

  1. 当前代码被保存。
  2. 代码的执行被移交给一个通常被预定义的异常处理函数。
  3. 异常处理函数接着继续执行保存的代码,从代码的另一个位置开始执行,甚至完全结束程序的执行。这个决定是根据异常的性质做出的。

为什么使用异常处理而不是错误处理?

异常处理比错误处理有以下优点。

  • 错误类型分组。异常处理允许将错误归类,也可以将它们归入类型。这一点是普通错误处理所不能实现的。
  • 将错误处理代码与常规代码分开,使用try...catch的异常处理使程序代码与错误处理代码分开,从而使代码清晰、易读。

异常可以用不同的方法来处理,下面讨论。

异常处理方法

1.使用基本的异常来处理错误

这涉及到在程序代码中每次抛出异常时使用try...catch 块来处理异常。有时抛出的异常没有被捕获,这就会返回一个错误。

下面是一个没有捕捉到异常的代码例子,其输出结果是一个错误。


<?php

//function created
function ConfirmNumber($Num) 
{
  if($Num>1) 
  {
    throw new exception ("The number must be 1 or below");
  }
return True;
}

ConfirmNumber(2);

?>

上面的代码片段输出了一个错误信息,因为已经抛出了异常,但代码中没有包含catch块。因此,没有catch块,try块就不能存在。

为了避免上述的错误,应该在代码中使用正确的块,如下图所示。


<?php
// Create function ConfirmNumber
function Confirm_Number($Num) 
{
  if($Num>1) 
  {
    throw new exception ("The number must be 1 or below");
  }
  return True;
}


try
 {
  Confirm_Number(2);

  
  print 'The number is 1 or below'
}


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

上面的代码抛出了一个异常,并使用try和catch块成功地捕获了它。

2.创建一个特殊的自定义异常类

这涉及到创建一个带有函数的自定义类,这些函数可以在发生异常的情况下被调用。这个自定义的异常类预计会借用PHP的异常类的属性,再加上其他附加功能。

下面是一个关于如何创建异常类的代码说明。


<?php
// Decleare varriable emailAddress
 $email_Address = "awinomackie@gmail.com";

// customized class creation
class customizedException extends exception
 {
  // function error_message creation
  public function error_Msge() 
  {
   
    $error_Message = 'Error in the line '.$this->getLine().':'.$this->getMessage().' is not a valid E-Mail';
    return $error_Message;
  }
}
//exception handling block
try 
{
  // validate if the email address is correct
  if(filter_var($email_Address, FILTER_VALIDATE_EMAIL) ==FALSE) 
  {
   
    throw new customizedException($email_Address);
  }
}

catch (customizedException $e) 
{
 //print error message
  print $e->error_Msge();
}
?>

3.使用多个异常实例

这涉及到使用多个异常处理类来检查许多异常实例。

下面是一个关于使用多个异常实例的代码说明。


<?php
//declare varriable and initialize
$email_Address = "awinomackie@gmail.com";

// exception class creation
class customizedException extends Exception 
{
  //create function Error _message
  public function error_Msge() 
  {
  
    $error_Message = 'Error in the  line '$this->getLine().': <b>'.$this->getMessage().' is not a valid E-Mail';
    return $error_Message;
  }
}

try
 {
//validate the email address
  if(filter_var($email_Address, FILTER_VALIDATE_EMAIL) == FALSE)
  {
   
    throw new customizedException($email_Address);
  }
 
  if(strpos($email_Address, "example") !== FALSE)
  {
    throw new Exception("$email_Address is an example e-mail");
  }
}
// outputs
catch (customizedException $e) 
{
  print $e->error_Msge();
}

catch(Exception $e) 
{
  print $e->get_Message();
}
?>

上面的代码被用来测试两个条件,如果任何一个条件不满足,就会抛出异常。

4.重新抛出异常

这发生在需要以不同的方式处理一个异常,而不是以标准的异常处理方式。因此,一个异常在catch块中被第二次抛出。

下面是一个关于重新抛出异常的代码说明。


<?php
// varriable declaration
$Email = "awinomackie@gmail.com";

// exception class creation
class customizedException extends Exception 
{
  //create function
  public function error_Msge() 
  {
    
    $error_Message = $this->get_Message().' is not a valid E-Mail.';

    return $error_Message;
  }
}

try 
{

  //email validation
  try 
  {
    
    if(strpos($email_Address, "example") !== FALSE) 
    {
     
      throw new Exception($email_Address);
    }
  }
  catch(Exception $e) {
    
    throw new customizedException($email_Address);
  }
}
//output
catch (customizedException $e) {
  
  print $e->error_Msge();
}
?>

5.使用一组顶层的异常处理函数

这是一种处理未捕捉到的异常的方法。一个用户定义的函数set_exception_handler() 来实现,如下面的代码图所示。


<?php

// create function the_Exception
function the_Exception($exception) 
{
  //print the exception message
  echo "The Exception is:" . $exception->getMessage();
}
//declare the exception handler function
set_exception_handler('the_Exception');

throw new Exception('Exception not caught');

?>

结论

相对于错误处理,异常处理正在成为一颗新星。异常处理有无尽的优势和无数的可能性,似乎是PHP中代码调试的未来。