• 微信号
  • 微信号
目录

PHP基础

您当前的位置:首页 > 我的笔记 > PHP基础>php异常处理

上一篇: php调试技术

下一篇: php如何处理错误

php异常处理

异常处理概述

php中加入了异常处理机制,它与错误的区别在于:异常定义了程序中遇到的非致命的错误,如,程序运行磁盘不足,网络连接中断、*作的文件不存在等。

在处理这些异常错误前,需要获取异常错误信息,才能推断程序中错误所在。在php中内置了一个异常类Exception来描述异常信息

class Exception{ 
 protected $message='Unknown exceptiong'; //异常信息 
 protected $code=0; //用户自定义异常代码 
 protected $file; //发生异常文件名 
 protected $line; //发生异常的代码行好 
 function __construct($message=null;$code=0); 
 final function getMessage(); //返回异常信息 
 final function getCode(); //返回异常代码 
 final function getFile(); //返回异常文件名 
 final function getLine(); //返回异常的代码行号 
 final function getTrace(); //backtrace()数组 
 final function getTraceAsString(); //已格式化成字符串getTrace()信息 
 // 可重载的方法 
 function __toString(); //可输出字符串 
}

从Exception类定义可以看出,Exception类中成员属性和方法是用来描述和获取程序中异常信息,通过异常对象可以获取当前程序中的错误信息,从而方便程序对错误进行处理。

异常的处理

当异常发生时,需要对异常进行捕获并进行处理,在php中可以通过throw关键字抛出一个异常,如果要捕获和处理异常需要try…catch代码块来完成。

案例

<?php 
 //创建可抛出一个异常的函数 
 function checkNum($number){ 
 if($number>1){ 
 //抛出异常 
 throw new Exception("value must be 1 or below"); 
 } 
 return true; 
 } 
 //可能触发异常的代码 
 try{ 
 checkNum(2); 
 } 
 //捕获异常 
 catch(Exception $e){ 
 echo 'Message:' . $e->getMessage(); 
 } 
?>

运行结果

使用throw关键字抛出一个异常,在try块中调用了引发异常的checkNum()函数。如果没有出发异常,则代码继续执行。如果异常被出发,则会抛出一个异常。使用catch块捕获异常,并创建一个包含异常信息的对象,异常被捕获后,执行catch块中处理的代码

自定义异常

虽然php提供了异常处理Exception具备常用的一些功能,但有时候我们希望使用不同的异常类,针对特定类型的异常进行处理,此时需要创建一个自定义异常类

自定义异常类,只需要继承自Exception类,并添加自定义的成员属性和方法即可

案例

<?php 
 //创建一个自定义异常类CustomException,继承自Exception 
 class CustomException extends Exception{ 
 //定义错误方法 errorMessage 
 public function errorMessage(){ 
 //定义错误信息显示格式 
 $errorMsg= 'error on line'.$this->getLine().'in'.$this->getFile().':<b>'.$this->getMessage().'</b> is not a valid E-Mail address'; 
 return $errorMsg; 
 } 
 } 
 $email="admin@qq....com"; 
 try{ 
 //检查邮箱地址是否合法 
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE){ 
 //如果邮箱地址不合法,则抛出异常 
 throw new CustomException($email); 
 
 } 
 } 
 catch (CustomException $e){ 
 //输出格式错误 
 echo $e->errorMessage(); 
 } 
?>

运行结果

代码定义了一个自定义异常类CustomException,继承自Exception类,并添加了成员发发errorMessage(),try代码用于检查邮箱是否合法,若邮箱非法,则抛出自定义异常CustomException。catch代码块用于处理捕获的异常

多个catch块

一段脚本可以使用多个异常,来检测多种情况,也就是说一个try语句对应多个catch语句。在脚本中可以使用多个if……else代码块,或一个switch代码块,或者嵌套多个异常。这些异常能够使用不同的异常类,并返回不同的错误信息。

案例

<?php 
 //创建一个自定义异常类CustomException,继承自Exception 
 class CustomException extends Exception{ 
 //定义错误方法 errorMessage 
 public function errorMessage(){ 
 //定义错误信息显示格式 
 $errorMsg= 'error on line'.$this->getLine().'in'.$this->getFile().':<b>'.$this->getMessage().'</b> is not a valid E-Mail address'; 
 return $errorMsg; 
 } 
 } 
 $email="user@admin.com"; 
 try{ 
 //检查邮箱地址是否合法 
 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE){ 
 //如果邮箱地址不合法,则抛出异常 
 throw new CustomException($email); 
 
 } 
 //检查邮箱地址是否存在字符串admin 
 if(strpos($email,"admin") !== FALSE){ 
 //如果存在则抛出异常 
 throw new Exception("$email is an example e-mail"); 
 } 
 } 
 catch (CustomException $e){ 
 //捕获我们自定义错误类CustomException中抛出的邮件是否合法的异常信息 
 echo $e->errorMessage(); 
 } 
 catch(Exception $e){ 
 //捕获默认错误类Exception抛出永祥地址中是否有字符串“admin”的异常信息 
 echo $e->getMessage(); 
 } 
?>

运行结果

定义一个自定义异常类CustExceptiom,在try代码更具用户输入地址不同,会引发不同的异常,会引发不同的异常,在两个catch代码块中分别捕获CustExceptiom和Exception异常并处理

重新抛出异常

在实际开发中,但异常信息抛出需要以不同的方式对它进行处理,此时,可以在一个catch快代码中再次抛出异常,脚本应该对用户掩藏系统错误,对编程人员来说,系统错误也许很重要,但是用户对他们并不感兴趣,为了让用户更容易使用,可以再次抛出比较友好的消息异常

案例

<?php 
 //创建一个自定义异常类CustomException,继承自Exception 
 class CustomException extends Exception{ 
 //定义错误方法 errorMessage 
 public function errorMessage(){ 
 //定义错误信息显示格式 
 $errorMsg= 'error on line'.$this->getLine().'in'.$this->getFile().':<b>'.$this->getMessage().'</b> is not a valid E-Mail address'; 
 return $errorMsg; 
 } 
 } 
 $email="user@admin.com"; 
 try{ 
 try{ 
 //检查邮箱地址是否存在字符串admin 
 if(strpos($email,"admin") !== FALSE){ 
 //如果存在则抛出异常 
 throw new Exception($email); 
 } 
 } 
 catch(Exception $e){ 
 //再次抛出异常 
 throw new CustomException($email); 
 } 
 } 
 catch (CustomException $e){ 
 //捕获异常信息 
 echo $e->errorMessage(); 
 } 
 
?>

运行结果

设置顶层异常处理器

在实际开发中,为了保证程序正常运行,需要在所有可能出现的异常的地方进行异常监视,但是程序出现异常的地方是无法预料的,为了保证程序正常运行,php提供了set_exception_handler()函数用于对这些没有进行异常监视的异常进行处理,改函数也称为顶层异常处理器

顶层异常处理器用于没有用try/catch块来捕获的异常,改函数声明如下

callable set_exception_handler(callable $exception_handler)

该函数只有个参数$excerption_handler()表示异常处理函数,该异常处理函数需要在调用前定义

案例

<?php 
 function ExceptionHandle($exception){ 
 echo "<b>异常信息:</b>" .$exception->getMessage(); 
 } 
 set_exception_handler("ExceptionHandle"); 
 throw new Exception("你没有捕获的异常信息"); 
?>

运行结果

set_exception_handler()函数接受了ExceptionHandle()函数作为参数,通过throw抛出一个异常,但没有与之对应的try和catch代码块,所以触发了set_exception_handler()函数,通过执行ExceptionHandle()函数实现了异常的处理

上一篇: php调试技术

下一篇: php如何处理错误