本文实例总结了php中异常处理方法。分享给大家供大家参考。具体分析如下:

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

PHP 异常处理


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


当异常被触发时,通常会发生:在PHP5中添加了类似于其它语言的错误异常处理模块。在
PHP代码中所产生的异常可被 throw语句抛出并被 catch
语句捕获。需要进行异常处理的代码都必须放入 try
代码块内,以便捕获可能存在的异常。每一个 try 至少要有一个与之对应的
catch。

在PHP5中添加了类似于其它语言的错误异常处理模块。在
PHP代码中所产生的异常可被 throw语句抛出并被 catch
语句捕获。需要进行异常处理的代码都必须放入 try
代码块内,以便捕获可能存在的异常。每一个 try 至少要有一个与之对应的
catch。使用多个 catch 可以捕获不同的类所产生的异常。当 try
代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP
代码就会在跳转到最后一个 catch 的后面继续执行。当然,PHP 允许在 catch
代码块内再次抛出(throw)异常。当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而
PHP 就会尝试查找第一个能与之匹配的
catch。如果一个异常没有被捕获,而且又没用使用 set_exception_handler()
作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught
Exception … (未捕获异常)的提示信息。

异常是什么

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

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

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

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

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

  • 异常的基本使用
  • 创建自定义的异常处理器
  • 多个异常
  • 重新抛出异常
  • 设置顶层异常处理器

注释:异常应该仅仅在错误情况下使用,而不应该用于在一个指定的点跳转到代码的另一个位置。


使用多个 catch 可以捕获不同的类所产生的异常,当 try
代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP
代码就会在跳转到最后一个 catch 的后面继续执行。当然,PHP 允许在 catch
代码块内再次抛出异常,当一个异常被抛出时,其后的代码将不会继续执行,而 PHP
就会尝试查找第一个能与之匹配的
catch,如果一个异常没有被捕获,而且又没用使用 set_exception_handler()
作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught
Exception … 的提示信息.

1、异常类的层级关系:

异常的基本使用

当异常被抛出时,其后的代码不会继续执行,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:webfoldertest.php:6
Stack trace: #0 C:webfoldertest.php(12):
checkNum(28) #1 {main} thrown in C:webfoldertest.php on line 6

1、异常类的层级关系,代码如下:复制代码
代码如下:class NotFoundException extends Exception{}

 代码如下

Try、throw 和 catch

要避免上面实例中出现的错误,我们需要创建适当的代码来处理异常。

适当的处理异常代码应该包括:

  1. Try – 使用异常的函数应该位于 “try”
    代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  2. Throw – 里规定如何触发异常。每一个 “throw” 必须对应至少一个
    “catch”。
  3. Catch – “catch” 代码块会捕获异常,并创建一个包含异常信息的对象。

让我们触发一个异常:

<?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 in a “try” block
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
catch(Exception $e)
{
echo ‘Message: ‘ .$e->getMessage();
}
?>

上面代码将得到类似这样一个错误:

Message: Value must be 1 or below

class InputException extends Exception{}

class NotFoundException extends Exception{}  
class InputException extends Exception{}  
class DBException extends Exception{} 

实例解释:

上面的代码抛出了一个异常,并捕获了它:

  1. 创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
  2. 在 “try” 代码块中调用 checkNum() 函数。
  3. checkNum() 函数中的异常被抛出。
  4. “catch” 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
  5. 通过从这个 exception 对象调用
    $e->getMessage(),输出来自该异常的错误消息。

然而,为了遵循 “每个 throw 必须对应一个 catch”
的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。


class DBException extends Exception{}

2、配置未捕捉异常的处理器:

创建一个自定义的 Exception 类

创建自定义的异常处理程序非常简单。我们简单地创建了一个专门的类,当 PHP
中发生异常时,可调用其函数。该类必须是 exception 类的一个扩展。

这个自定义的 exception 类继承了 PHP 的 exception
类的所有属性,您可向其添加自定义的函数。

我们开始创建 exception 类:

<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = ‘Error on line ‘.$this->getLine().’ in
‘.$this->getFile()
.’: <b>’.$this->getMessage().'</b> is not a valid 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()。

2、配置未捕捉异常的处理器,代码如下:复制代码 代码如下:function
exception_uncaught_handler { header(‘Content-type:text/html;
charset=utf-8’); if ($e instanceof NotFoundException) exit; elseif ($e
instanceof DBException) exit; else exit; }
set_exception_handler(‘exception_uncaught_handler’);3、在数据库连接代码,手动抛出DBException异常但未使用try…catch进行捕获处理,该异常将被PHP自定义异常处理器,exception_uncaught_handler()函数处理:复制代码 代码如下:$this->resConn =
mysql_connect ($CONFIGS[‘db_host’], $CONFIGS[‘db_user’],
$CONFIGS[‘db_pwd’]); if (false == is_resource throw new
DBException(‘数据库连接失败。’.mysql_error;4、业务逻辑一瞥:复制代码 代码如下:if (0 !=
strcmp($curAlbum->interest_id, $it))

 代码如下

实例解释:

上面的代码抛出了一个异常,并通过一个自定义的 exception 类来捕获它:

  1. customException() 类是作为旧的 exception
    类的一个扩展来创建的。这样它就继承了旧的 exception
    类的所有属性和方法。
  2. 创建 errorMessage() 函数。如果 e-mail
    地址不合法,则该函数返回一条错误消息。
  3. 把 $email 变量设置为不合法的 e-mail 地址字符串。
  4. 执行 “try” 代码块,由于 e-mail 地址不合法,因此抛出一个异常。
  5. “catch” 代码块捕获异常,并显示错误消息。

throw new NotFoundException;

function exception_uncaught_handler(Exception $e) {  
header(‘Content-type:text/html; charset=utf-8’);  
if ($e instanceof NotFoundException)  
exit($e->getMessage());  
elseif ($e instanceof DBException)  
exit($e->getMessage());  
else  
exit($e->getMessage());  
}  
set_exception_handler(‘exception_uncaught_handler’);  

多个异常

可以为一段脚本使用多个异常,来检测多种情况。

可以使用多个 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> is not a valid 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();
}
?>

以上就是PHP自定义异常处理器的具体使用方法.

3、在数据库连接代码,手动抛出DBException异常但未使用try…catch进行捕获处理,该异常将被PHP自定义异常处理器

实例解释:

上面的代码测试了两种条件,如果其中任何一个条件不成立,则抛出一个异常:

  1. customException() 类是作为旧的 exception
    类的一个扩展来创建的。这样它就继承了旧的 exception
    类的所有属性和方法。
  2. 创建 errorMessage() 函数。如果 e-mail
    地址不合法,则该函数返回一个错误消息。
  3. 把 $email 变量设置为一个字符串,该字符串是一个有效的 e-mail
    地址,但包含字符串 “example”。
  4. 执行 “try” 代码块,在第一个条件下,不会抛出异常。
  5. 由于 e-mail 含有字符串 “example”,第二个条件会触发异常。
  6. “catch” 代码块会捕获异常,并显示恰当的错误消息。

如果 customException 类抛出了异常,但没有捕获
customException,仅仅捕获了 base exception,则在那里处理异常。


发表评论

电子邮件地址不会被公开。 必填项已用*标注