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

可以使用自定义异常处理器来处理所有未捕获的异常(没有用 try/catch 捕获的异常)

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

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

【例】

 1 <?php
 2 header('content-type:text/html; charset=utf-8');
 3 header('content-type:text/html; charset=utf-8');
 4 function exceptionHandler_1($e){
 5     echo '自定义异常处理器1';
 6     echo '异常信息:'.$e->getMessage();
 7 }
 8 
 9 function exceptionHandler_2($e){
10     echo '自定义异常处理器2';
11     echo '异常信息:'.$e->getMessage();
12 }
13 
14 throw new Exception('测试');

运行后输出:

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

 1 <?php
 2 header('content-type:text/html; charset=utf-8');
 3 header('content-type:text/html; charset=utf-8');
 4 function exceptionHandler_1($e){
 5     echo '自定义异常处理器1',__FUNCTION__,'<br>';
 6     echo '异常信息:'.$e->getMessage();
 7 }
 8 
 9 function exceptionHandler_2($e){
10     echo '自定义异常处理器2',__FUNCTION__,'<br>';
11     echo '异常信息:'.$e->getMessage();
12 }
13 
14 set_exception_handler('exceptionHandler_1');
15 throw new Exception('测试');

运行后输出:

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

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

 1 <?php
 2 header('content-type:text/html; charset=utf-8');
 3 header('content-type:text/html; charset=utf-8');
 4 function exceptionHandler_1($e){
 5     echo '自定义异常处理器1',__FUNCTION__,'<br>';
 6     echo '异常信息:'.$e->getMessage();
 7 }
 8 
 9 function exceptionHandler_2($e){
10     echo '自定义异常处理器2',__FUNCTION__,'<br>';
11     echo '异常信息:'.$e->getMessage();
12 }
13 
14 set_exception_handler('exceptionHandler_1');
15 set_exception_handler('exceptionHandler_2');
16 throw new Exception('测试');

输出:

 1 <?php
 2 header('content-type:text/html; charset=utf-8');
 3 header('content-type:text/html; charset=utf-8');
 4 function exceptionHandler_1($e){
 5     echo '自定义异常处理器1',__FUNCTION__,'<br>';
 6     echo '异常信息:'.$e->getMessage();
 7 }
 8 
 9 function exceptionHandler_2($e){
10     echo '自定义异常处理器2',__FUNCTION__,'<br>';
11     echo '异常信息:'.$e->getMessage();
12 }
13 
14 set_exception_handler('exceptionHandler_1');
15 set_exception_handler('exceptionHandler_2');
16 restore_exception_handler();
17 throw new Exception('测试');

输出:

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

 1 <?php
 2 header('content-type:text/html; charset=utf-8');
 3 header('content-type:text/html; charset=utf-8');
 4 function exceptionHandler_1($e){
 5     echo '自定义异常处理器1',__FUNCTION__,'<br>';
 6     echo '异常信息:'.$e->getMessage();
 7 }
 8 
 9 function exceptionHandler_2($e){
10     echo '自定义异常处理器2',__FUNCTION__,'<br>';
11     echo '异常信息:'.$e->getMessage();
12 }
13 
14 set_exception_handler('exceptionHandler_1');
15 throw new Exception('测试');
16 
17 echo 'continue...';

输出:

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

 1 <?php
 2 class ExceptionHandler{
 3     protected $_exception;
 4     protected $_logFile = 'D:/practise/php/Error/LogException2.log';
 5     public function __construct(Exception $e){
 6         //保存异常对象
 7         $this->_exception = $e;
 8     }
 9 
10     public static function handle(Exception $e){
11         $self = new self($e);
12         $self->log();
13         echo $self;
14     }
15 
16     //记录日志方法
17     public function log(){
18         error_log($this->_exception->getMessage().PHP_EOL, 3, $this->_logFile);
19     }
20 
21     public function __toString(){
22         $message = <<<EOF
23         <!DOCTYPE html>
24         <html lang="en">
25         <head>
26             <meta charset="UTF-8">
27             <title>Document</title>
28         </head>
29         <body>
30             <h1>出现异常</h1>
31             <p>请联系管理员</p>
32         </body>
33         </html>
34 EOF;
35     return $message;
36     }
37 }
38 
39 
40 set_exception_handler(array('ExceptionHandler', 'handle'));//处理未捕获的异常。第一个参数类名,第二个参数方法名
41 //测试
42 throw new Exception("测试自定义的异常处理器");

输出:

文件 LogException2.log:

原文地址:https://www.cnblogs.com/dee0912/p/4623362.html