zoukankan      html  css  js  c++  java
  • 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:

  • 相关阅读:
    加密算法使用(五):RSA使用全过程
    加密算法使用(四):AES的使用
    加密算法使用(三):用用BASE64
    加密算法使用(二):使用MD5加密字符串(另:byte数组转16进制自动补零方法写法)
    加密算法使用(一):用CRC32来压缩32uuid字符串
    【转载】阿里云ECS Linux服务器禁止某些IP访问
    【转载】Sqlserver数据库备份的几种方式
    【转载】网站域名备案相关流程介绍
    【转载】C#工具类:实现文件操作File的工具类
    【转载】 禁止国外IP访问你的网站
  • 原文地址:https://www.cnblogs.com/dee0912/p/4623362.html
Copyright © 2011-2022 走看看