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代码块用于处理捕获的异常
一段脚本可以使用多个异常,来检测多种情况,也就是说一个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()函数实现了异常的处理
*声明:内容来源于网络收集和整理,版权归原著所有,如来源信息有误或侵犯权益,请联系站长作修改和删除处理。