您的位置:首页 > 编程语言 > PHP开发

12. php的错误和异常处理(二)

2016-05-23 18:20 387 查看

1. 异常处理实现

通过以下语句实现:

<?php
try{    //所有需要进行异常处理的代码都必须放入这个代码块内
... ... //这里可以使用throw语句跑出一个异常对象
}catch(ex1){    //使用该代码块捕获一个异常,并处理
... ...     //处理发生的异常,也可再次抛出异常
}


在PHP代码中所产生的异常可以被throw语句抛出并被catch语句捕获。需要进行异常处理的代码都必须放入try代码内,以便捕获可能存在的异常。每一个try至少要有一个与之对应的catch,也不可能出现单独的catch。例如:

<?php
try{
$error = 'Always throw this error';
throw new Exception($error);    //创建一个异常对象,通过throw语句抛出
echo '不执行'; //从这里开始,try代码内的代码将不会再被执行
} catch(Exception $e){
echo ' 错误信息:',$e->getMessage(),"</br>";//输出捕获的异常消息
}
echo "Hello World";     //程序没有崩溃继续向下执行


在PHP中,异常必须手动抛出。throw关键字将触发异常处理机制,它是一个语言结构,而不是一个函数,但必须给它传递一个对象作为值。如果在try语句中有一场对象被抛出,该代码块不会再继续向下执行,而直接跳转到catch中执行。在catch代码块中可以简单地输出一些异常的原因。在异常处理之后,程序不会崩溃会继续执行。

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

异常处理类Exception的结构,它并不是一段有实际意义的可用代码。

<?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()信息

/**
* 重载方法
* @return {[type]} [description]
*/
function __toString(){}     //可输出的字符串
}


如果使用自定义的类作为异常处理类,则必须是扩展内置异常处理类Exception的子类,非Exception类的子类是不能作为异常处理使用的。注意使用parent::construct()来检查所有的变量是否已经被赋值

例如:custom_error.php

<?php
/**
* Description: 自定义的一个异常处理类,但必须是扩展内异常处理的子类
* Version:     1.1
* Author:      Chang
* Date:        2016/05/23
* Time:        17:39
*/

class MyException extends Exception{
/**
* 重定义构造方法使用第一个参数message变为必须指定的属性
* @param [type]  $message [description]
* @param integer $code    [description]
*/
public function __construct($message, $code = 0){
//可以在这里定义自己的代码
//建议同时调用parent::construct()来检查所有的变量是否已经被赋值
parent::__construct($message, $code);
}

/**
* 重写父方法,自定义字符串输出的样式
* @return string [description]
*/
public function __toString(){
return __CLASS__.":[".$this->code."]".$this->message."<br/>";
}

/**
* 为这个异常自定义一个处理方法
* @return [type] [description]
*/
public function customFunction(){
echo "按自定义的方法处理出现的这个类型的异常</br>";
}
}

try{//使用自定义的异常类捕获一个异常,并处理异常
$error = '允许抛出这个错误';
throw new MyException($error);  //创建一个自定义的异常类对象,通过throw语句抛出
echo "不会被执行";
}catch(MyException $e){
echo '捕获异常:'.$e;    //输出捕获的异常消息
$e->customFunction();   //通过自定义的异常对象中的方法处理异常
}

echo '你好啊';


3. 捕获多个异常

在try代码块之后,必须至少给出一个catch代码块,也可以将多个catch代码块与一个try代码块进行关联。如果有多个catch代码块,传递给每一个catch代码块的对象必须具有不同的类型。PHP可以自动找到对应类型的catch块。如果都没有匹配到,则跳转到最有一个catch的后面继续执行。例如:

<?php
/**
* Description: 捕获多个异常
* Version:     1.1
* Author:      Chang
* Date:        2016/05/23
* Time:        17:58
*/

include './custom_error.php';
class TestException{
public $var;    //用来判断对象是否创建成功的成员属性

function __construct($value = 0){   //通过构造方法的传值决定抛出的异常
switch($value){                 //对传入的值进行选择性的判断
case 1:                     //传入参数为1,则抛出自定义的异常对象
throw new MyException("传入的值'1'是一个无效参数", 5);
break;
case 2:                     //传入参数为2,则抛出PHP内置的异常对象
throw new Exception("传入的值'2'不允许作为一个参数", 6);
break;
default:                    //传入参数合法,则不抛出异常
$this->var = $value;    //为对象成员属性赋值
break;
}
}
}

try{
$testObj = new TestException(); //使用默认的参数创建异常的测试类对象
echo "*****<br>";   //没有异常,正常执行
}catch(MyException $e){
echo "捕获自定义的异常:$e <br/>";
$e->customFunction();
}catch(Exception $e){
echo "默认捕获的异常:".$e->getMessage()."<br/>";
}
var_dump($testObj); //判断对象是否创建成功,如果没有任何异常,则创建成功

try{
$testObj1 = new TestException(1); //传入1时,抛出自定义异常
echo "*****<br>";   //不被执行
}catch(MyException $e){
echo "捕获自定义的异常:$e <br/>";
$e->customFunction();
}catch(Exception $e){  //这个catch区块不被执行
echo "默认捕获的异常:".$e->getMessage()."<br/>";
}
var_dump($testObj1); //有异常产生,这个对象没有创建成功

try{
$testObj2 = new TestException(2); //传入2时,抛出内置异常
echo "*****<br>";   //不被执行
}catch(MyException $e){ //这个catch区块不被执行
echo "捕获自定义的异常:$e <br/>";
$e->customFunction();
}catch(Exception $e){
echo "默认捕获的异常:".$e->getMessage()."<br/>";
}
var_dump($testObj2); //有异常产生,这个对象没有创建成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息