• 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:

  • 相关阅读:
    实验一 密码引擎4国䀄算法交叉测试(选做)
    实验一密码引擎加密API实现与测试
    kettley引入jar包
    Novice学Pytest(2)assert断言
    Novice学Pytest(13)重复执行用例插件pytestrepeat的详细使用
    Novice学Pytest(6)conftest.py的详细讲解
    Novice学Pytest(7)skip和skipif跳过用例
    Novice学Pytest(8)使用自定义标记mark
    Novice学Pytest(12)测试结果生成HTML报告插件pytesthtml的详细使用
    Novice学Pytest(11)失败重跑插件pytestrerunfailures的详细使用
  • 原文地址:https://www.cnblogs.com/dee0912/p/4623362.html
Copyright © 2020-2023  润新知