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

PHP 错误与异常 笔记与总结(16 )自定义异常处理器

2015-07-06 00:43 691 查看
可以使用自定义异常处理器来处理所有未捕获的异常(没有用 try/catch 捕获的异常)

set_exception_handler():设置一个用户定义的异常处理函数,当一个未捕获的异常发生时所调用函数的名称(回调函数),该函数必须在调用

set_exception_handler() 之前已经定义。该处理函数需要接受一个参数,该参数是一个抛出的异常对象

【例】

<?php
header('content-type:text/html; charset=utf-8');
header('content-type:text/html; charset=utf-8');
function exceptionHandler_1($e){
echo '自定义异常处理器1';
echo '异常信息:'.$e->getMessage();
}

function exceptionHandler_2($e){
echo '自定义异常处理器2';
echo '异常信息:'.$e->getMessage();
}

throw new Exception('测试');


运行后输出:



出现致命错误:没有捕获到异常“Exception”。当出现未捕获的异常这种情况时,就可以使用 set_exception_hanlder() 方法:

<?php
header('content-type:text/html; charset=utf-8');
header('content-type:text/html; charset=utf-8');
function exceptionHandler_1($e){
echo '自定义异常处理器1',__FUNCTION__,'<br>';
echo '异常信息:'.$e->getMessage();
}

function exceptionHandler_2($e){
echo '自定义异常处理器2',__FUNCTION__,'<br>';
echo '异常信息:'.$e->getMessage();
}

set_exception_handler('exceptionHandler_1');
 throw new Exception('测试');


运行后输出:



上例中使用 自定义异常处理器1 来处理未捕获的异常。

【例2】 当定义了多个 set_exception_handler() 方法时,最后的方法会覆盖之前的方法;而使用 restore_exception_handler() 则会恢复到上一次定义过的自定义处理函数。

<?php
header('content-type:text/html; charset=utf-8');
header('content-type:text/html; charset=utf-8');
function exceptionHandler_1($e){
echo '自定义异常处理器1',__FUNCTION__,'<br>';
echo '异常信息:'.$e->getMessage();
}

function exceptionHandler_2($e){
echo '自定义异常处理器2',__FUNCTION__,'<br>';
echo '异常信息:'.$e->getMessage();
}

set_exception_handler('exceptionHandler_1');
set_exception_handler('exceptionHandler_2');
throw new Exception('测试');


输出:



<?php
header('content-type:text/html; charset=utf-8');
header('content-type:text/html; charset=utf-8');
function exceptionHandler_1($e){
echo '自定义异常处理器1',__FUNCTION__,'<br>';
echo '异常信息:'.$e->getMessage();
}

function exceptionHandler_2($e){
echo '自定义异常处理器2',__FUNCTION__,'<br>';
echo '异常信息:'.$e->getMessage();
}

set_exception_handler('exceptionHandler_1');
set_exception_handler('exceptionHandler_2');
restore_exception_handler();
 throw new Exception('测试');


输出:



使用自定义异常处理函数以后,程序不会继续向下执行:

<?php
header('content-type:text/html; charset=utf-8');
header('content-type:text/html; charset=utf-8');
function exceptionHandler_1($e){
echo '自定义异常处理器1',__FUNCTION__,'<br>';
echo '异常信息:'.$e->getMessage();
}

function exceptionHandler_2($e){
echo '自定义异常处理器2',__FUNCTION__,'<br>';
echo '异常信息:'.$e->getMessage();
}

set_exception_handler('exceptionHandler_1');
throw new Exception('测试');

echo 'continue...';


输出:



以上是自定义异常处理函数来处理未捕获的异常,同样也可以使用自定义异常处理类来处理未捕获的异常

<?php
class ExceptionHandler{
protected $_exception;
protected $_logFile = 'D:/practise/php/Error/LogException2.log';
public function __construct(Exception $e){
//保存异常对象
$this->_exception = $e;
}

public static function handle(Exception $e){
$self = new self($e);
$self->log();
echo $self;
}

//记录日志方法
public function log(){
error_log($this->_exception->getMessage().PHP_EOL, 3, $this->_logFile);
}

public function __toString(){
$message = <<<EOF
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>出现异常</h1>
<p>请联系管理员</p>
</body>
</html>
EOF;
return $message;
}
}

set_exception_handler(array('ExceptionHandler', 'handle'));//处理未捕获的异常。第一个参数类名,第二个参数方法名
//测试
throw new Exception("测试自定义的异常处理器");


输出:



文件 LogException2.log:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: