Maison > Article > développement back-end > 扩展PHP内置的异常处理类,php内置异常处理_PHP教程
在try代码块中,需要使用throw语句抛出一个异常对象,才能跳到转到catch代码块中执行,并在catch代码块中捕获并使用这个异常类的对象。虽然在PHP中提供的内置异常处理类Exception,已经具有非常不错的特性,但在某些情况下,可能还要扩展这个类来得到更多的功能。所以用户可以用自定义的异常处理类来扩展PHP内置的异常处理类。以下代码说明了在内置的异常处理类中,哪些属性和方法在子类中是可访问和可继承的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php
class Exception{
protected $message = 'Unknown exception' ; //异常信息
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的子类,非Exception类的子类是不能作为异常处理类使用的。如果在扩展内置异常处理类Excepiton时重新定义构造函数,建议同时调用parent::construct()来检查所有的变量是否已被赋值。当对象要输出字符串的时候,可以重载__toString()并自定义输出的样式。可以在自定义的子类中,直接使用内置异常处理Exception类中的所有成员属性,但不能重新改写从该父类中继承过来的成员方法,因为该类的大多数公有方法都是final的。
创建自定义的异常处理程序非常简单,和传统类的声明方式相同,但该类必须是内置异常处理类Exception的一个扩展。当PHP中发生异常时,可调用自定义异常类中的方法进行处理。创建一个自定义的MyException类,继承了内置异常处理类Exception中的所有属性,并向其添加了自定义的方法。代码及应用如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php
//滴定仪一个异常处理类,但必须是扩展内异常处理类的子类
class MyException extends Exception{
//重定义构造器使第一个参数message变为必须被指定属性
public function __construct( $message , $code =0){
//在这里定义一些自己的代码
//建议同时调用parent::construct()来检查所有的变量是否已被赋值
parent::__construct( $message , $code );
}
//重写父类方法,自定义字符串输出的样式
public function __toString(){
return __CLASS__ . ":[" . $this ->code. "]:" . $this ->message. "<br>" ;
}
//为这个异常自定义一个处理方法
public function customFunction(){
echo "按自定义的方法处理出现的这个类型的异常<br>" ;
}
}
try {
$error = '允许抛出这个错误' ;
throw new MyException( $error ); //创建一个自定义异常的处理对象,通过throw语句抛出
echo 'Never executed' ; //从这里开始,try代码块内的代码将不会再被执行
} catch (MyException $e ){ //捕获自定义的异常对象
echo '捕获异常:' . $e ; //输出捕获的异常消息
$e ->customFunction(); //通过自定义的异常对象中的方法处理异常
}
echo '你好呀' ; //程序没有崩溃继续向下执行
?>
|
在自定义的MyExcepition类中,使用父类中的构造方法检查所有的变量是否已被赋值。而且重载了父类中的__toString()方法,输出自己定制捕获的异常处理类,在使用上没有多大区别,只不过在自定义的异常处理类中,可以调用为具体的异常专门编写的处理方法。
>> 本文固定链接: http://php.ncong.com/php_course/wrong/yichangchulilei.html
>> 转载请注明: 恩聪php 2014年08月06日 于 恩聪PHP学习教程 发表
这个问题我前几天也跟同事讨论过。我这么来解释把
比如你调用了try catch ,数组超标,那程序怎么知道是数组超标呢,那肯定是数组类报出来的。
而数组类里面,肯定是throw出来,你才能catch到,得到message,数组超标,但是如果数组类里面,直接catch了,就没有异常了!这样你调用数组即使超标了,你自己的catch是catch不到,因为没人抛出异常
别人的回答太官话了,求采纳我的
我们介绍的这个PHP自定义异常处理器为PHP内置的exception_uncaught_handler()函数。该函数可用于设置用户自定义的异常处理函数,处理trycatch块未捕获的异常。
以下4段代码为我在waylife项目中的简单应用(非生产环境),不健壮也不美化,但该SNS项目早已经夭折。
1、异常类的层级关系:
classNotFoundExceptionextendsException{}
classInputExceptionextendsException{}
classDBExceptionextendsException{}
2、配置未捕捉异常的处理器:
functionexception_uncaught_handler(Exception$e){
header('Content-type:text/html;charset=utf-8');if($einstanceofNotFoundException)exit($e-
getMessage());
elseif($einstanceofDBException)exit($e-
getMessage());elseexit($e-
getMessage());}set_exception_handler('exception_uncaught_handler');
3、在数据库连接代码源码天空
,手动抛出DBException异常但未使用trycatch进行捕获处理,该异常将被PHP自定义异常处理器exception_uncaught_handler()函数处理:$this-resConn=mysql_connect
($CONFIGS['db_host'],$CONFIGS['db_user'],$CONFIGS['db_pwd']);if(false==is_resource($this-resConn))thrownewDBException('数据库连接失败。'.mysql_error($this-resConn));4、业务逻辑一瞥:
if(0!=strcmp($curAlbum-
interest_id,$it))
thrownewNotFoundException('很抱歉,你所访问的相册不存在');