PHP异常处理

zxh5566  2016-08-15 20:00   Hits: 

异常Exception处理用于在指定的错误发生时改变脚本的正常流程,是PHP5中的一个新的重要特征,异常处理是一种可扩展,易维护的错误处理统一机制,并提供了一种新的面向对象的错误处理方式
1、异常处理实现
异常处理和编写程序的流程控制相似,所以也可以通过异常处理实现一种另类的条件选择结构,异常就是在程序运行过程中出现的一些意料之外的事件,如果不对此事件进行处理,则程序在执行时遇到异常将崩溃,处理异常需要在PHP脚本中使用如下语句:
try{}catch(ex1){}
在PHP代码中所产生的异常可以throw语句抛出并被catch语句捕获,需要进行异常处理的代码都必须放入try代码块中,以便捕获可能存在的异常,每一个try至少要有一个与之对应的的catch,也不能出现单独的catch,另外try和cache之间也不能有任何的代码出现,一个异常处理的简单实例如下

<?php
try{
$error = "always throw this error";
throw new Exception($error);
echo "never executed";
}catch(Exception $e){
echo "caught exception:".$e->getMessage()."\n";
}
echo "hello world";
?>

在上面示例中,如果try代码中出现某些错误,我们就可以执行一个抛出异常的操作,在PHP中,异常必须手动抛出,throw关键字将触发异常处理机制,它是一个语言结构,而不是一个函数,但必须给它传递一个对象作为值,在最简单的情况下,可以实例化一个内置的Exception类,就像以上代码所示,如果在try语句中有异常对象被抛出,该代码块不会再继续向下执行,而直接跳转到catch中,并传递给catch代码一个对象,也可以理解为被catch代码捕获对象,其实就是导致异常被throw语句抛出的对象,在catch代码块中可以简单的输出一些异常的原因,也可以是try代码块中任务的另一个版本解决方案,此外也可以在这个catch代码块中产生新的异常,最重要的是,在异常处理后,程序不会崩溃,而会继续执行。

2、扩展PHP内置的异常处理类

在try代码块中,需要使用throw语句抛出一个异常对象,才能跳转到catch代码块中执行,并在catch代码中捕获这个异常对象,虽然在PHP中提供内置异常处理类Exception,已经具有非常不错的特征,但在某些情况下,可能还要扩展这个类来得到更多的功能,所以用户用自定义的异常处理类来扩展PHP内置的异常处理类。

<?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(){}
final function getTraceAsString(){}
function __toString(){}
}
?>

上面这段代码只为说明内置异常处理类Exception的结构,它并不是有实际意义的可用代码。如果使用自定义的类作为异常处理类,则必须是扩展内置异常处理类的子类,非Exception的子类是不能作为异常处理类使用的,如果在扩展内置处理类时重新定义构造函数,建议同时调用parent::construct()来检测所有的变量是否已赋值,当对象要输出字符串的时候,可以重载__toString()并定义输出样式,可以在自定义的子类中,直接使用内置异常处理Exception类中所有成员属性,但不能重新改写从该父类中继承过来的成员方法,因为该类的大多数公有方法都是final的。

创建自定义的异常处理程序非常简单,和传统的声明方式相同,但该类必须是内置异常处理类Exception的一个扩展,当PHP中发生异常时,可调用自定义异常类中的方法进行处理,创建一个自定义的MyException类,继承了内置异常处理类中所有属性,并向其添加了自定义的方法。

<?php
class MyException extengs Exception{
public function __construct($message,$code=0){
parent::__construct($message,$code);
}

publi function __toString()
{
return __CLASS__.":[".$this->code."]:".$this->message."<br>";
}

public function customFunction{
echo "按自定义的方法处理出现的这个类型的异常<br>";
}

try{
$error = "允许抛出这个错误";
throw new MyException($error);
echo 'Never executed';
}catch(MyException $e){
echo "捕获异常".$e;
$e->getMessage();
}

}
?>

在自定义的MyException类中,使用父类中的构造方法检查所有的变量是否已经被赋值,而且重载了父类中的__toString()方法,输出自己定制捕获的异常消息,自定义和内置的异常处理类,在使用上没有多大区别,只不过在自定义的异常处理类中,可以调用为具体的异常专门编写的处理方法。

上一篇:PHP错误日志详解
下一篇:PHP日期和时间,UNIX时间戳,mktime()