• 【PHP】解析PHP中的错误和异常处理


    目录结构:

    contents structure [-]

    在这篇文章中,笔者将会阐述PHP中的异常处理,希望能够对你有所帮助。

    1.错误级别

    PHP5中定义了16种不同的错误级别,下面仅仅粘贴其中几种。

    级别常量 错误值 错误报告描述
    E_ERROR 1 致命的运行时错误(阻止脚本执行)
    E_WARNING 2 运行时警告(非致命性错误)
    E_PARSE 4 从语法中解析错误
    E_NOTICE 8 运行时注意消息(可能是或可能不是一个问题)
    E_CORE_ERROR 16 PHP启动时初始化过程中的致命错误
    E_CORE_WARNING 32 PHP启动时初始化过程中的警告(非致命性错)
    E_COMPILE_ERROR 64 编译时致命性错
    E_COMPILE_WARNING 128 编译时警告(非致命性错)
    E_USER_ERROR 256 用户自定义的致命错误
    E_USER_WARNING 512 用户自定义的警告(非致命性错误)
    E_USER_NOTICE 1024 用户自定义的提醒
    E_STRICT 2048 编码标准化警告(建议如何修改以向前兼容)
    E_ALL 32767

    所有的错误、警告和注意信息,在PHP5.4.0之前的版本之前不包含E_STRICT错误级别。

    注意:在PHP 5.4.x 中是32767,在PHP 5.3.x中是30719,在 PHP 5.2.x中是6143,在5.2.x之前的版本是2047。


    在知道了这些错误级别后,我们开始调整错误报告级别,既可以通过修改PHP配置文件,也可以通过修改PHP脚本代码来实现。

    先介绍如何通过修改PHP配置文件来实现,在PHP的配置文件(php.ini)中,display_errors直接控制PHP是否输出错误、提醒和警告信息。它的值有On、Off、stdout、stderr:
    On 或 stdout:表示输出所有消息到标准的输出流。
    stderr:表示输出所有消息到标准的错误流。
    Off:表示不显示任何消息。

    还可以通过PHP脚本代码来修改php.ini配置文件,通过ini_set(...)函数可以实现这个功能,
    比如修改php.ini配置文件中的display_errors属性的话,可以通过:

    ini_set("display_errors","On");

    这里是将所有的消息都输出到标准输出流。

    例如:

    <html>
        <head>
            <title>display_errors</title>
        </head>
        <body>
        <?php
            //ini_set("display_errors","Off");  
            echo "-------------------------------------<br/>";        
            gettype();//抛出警告信息
            echo "-------------------------------------<br/>";
        ?>
        </body>
    </html>

    效果图:


    给ini_set("display_errors","Off");取消注释后,会看到如下效果:


    通过手动修改PHP配置文件和ini_set函数,都可以达到这个功能,然而手动修改PHP配置文件的项目可移植性不强,推荐通过ini_set函数来实现。

    display_errors相当于总开关,要么开启所有错误消息输出,要么关闭所有的错误消息输出。那么有没有能够控制报告不同级别的错误设置呢?PHP提供的error_reporting()函数就可以动态完成设置错误报告级别。如:error_reporting(E_ALL);
    例如:

    <html>
        <head>
            <title>display_errors</title>
        </head>
        <body>
        <?php
            error_reporting(E_ALL);//报告所有错误
            echo "-------------------------------------<br/>";
            gettype();
            echo "-------------------------------------<br/>";
        ?>
        </body>
    </html>

    效果与ini_set("display_errors","On");一样。

    error_reporting()可以设置16中错误级别中的任何一种,强烈建议在设置的时候通过常量名来设置,在未来的版本中才能保证移植性。
    error_reporting()也可以接受位标志,例如:

    error_reporting(E_ERROR | E_WARNING);

    2.自定义处理器

    通过上面的案例我们可以看到,所有抛出的错误都是在错误代码处抛出的,这是标准的PHP错误处理函数。

    然而PHP允许程序员自定义错误和异常处理器,能够完全绕过PHP标准的错误和异常处理函数,这样的话,就可以自定义错误和异常的处理方式。

    mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )

    自定义的错误处理器,当有错误发生时,会调用该处理器设置的异常。

    callable set_exception_handler ( callable $exception_handler )

    自定义的异常处理器,当有未捕获的异常抛出时候,该函数设置的处理器就会处理该异常。

    restore_exception_handler()

    当使用set_exception_handler设置过自定义异常处理器后,restore_exception_handler可以恢复到之前的那个异常处理器。

    restore_error_handler()

    当使用set_error_handler设置过自定义错误处理器后,restore_error_handler可以恢复到之前的那个错误处理器。

    3.设置异常日志

    如果要设置异常日志的话,那么就要修改PHP配置文件php.ini。
    error_reporting = E_ALL//将向PHP发送每个错误
    display_errors=Off     //不显示错误报告
    log_errors=On          //开启日志记录
    log_errors_max_log=1024// 每个日志项的最大长度
    error_log="c:/myerror.log" //指定错误写进的文件

    在php文件中使用error_log()来记录日志,就可以将信息写入到myerror.log文件中。
    比如:

    error_log("unexpected error");

    error_log不仅可以指定日志的记录文件,还可以将日志输出到操作系统中,只要将error_log指定为syslog就可以了(Win 95不支持)。

    4.自定义异常类

    一个自定义的异常类必须从Exception派生,Exception类的元数据如下:

     Exception implements Throwable {
    /* Properties */
    protected string $message ;
    protected int $code ;
    protected string $file ;
    protected int $line ;
    /* Methods */
    public __construct ([ string $message = "" [, int $code = 0 [, Throwable $previous = NULL ]]] )
    final public string getMessage ( void )
    final public Throwable getPrevious ( void )
    final public mixed getCode ( void )
    final public string getFile ( void )
    final public int getLine ( void )
    final public array getTrace ( void )
    final public string getTraceAsString ( void )
    public string __toString ( void )
    final private void __clone ( void )
    }

    其中__construct表示构造方法,可以按照需要重写它的构造方法和__toString()方法。
    例如:

    <?php
        /* 自定义的一个异常处理类,但必须是扩展内异常处理类的子类 */
        class MyCustomException extends Exception{
            //重定义构造器使第一个参数 message 变为必须被指定的属性
            public function __construct($message, $code=0){
                //可以在这里定义一些自己的代码
             //建议同时调用 parent::construct()来检查所有的变量是否已被赋值
                parent::__construct($message, $code);
            }
            public function __toString() {        
              //重写父类方法,自定义字符串输出的样式
              return __CLASS__.":[".$this->code."]:".$this->message."<br>";
            }
            public function customFunction() {    
                 //为这个异常自定义一个处理方法
                 echo "按自定义的方法处理出现的这个类型的异常<br>";
            }
        }
    
        try{
            throw new MyCustomException("Unexpected Exception");
        }catch(MyCustomException $e){
            echo $e;
    
            $e->customFunction();
        }
        echo "<br/>";
        echo "end";
        ?>
  • 相关阅读:
    ios开发之--使用AFN上传3.1.0上传视频,不走成功回调原因及解决方法
    ios开发之--[_NSInlineData objectForKeyedSubscript:]
    swift开发之--代理协议的使用
    ios开发之--NSString的操作
    ios开发之--条用第三方地图路线导航
    ios开发之--多个按钮单选效果
    ios开发之--首页 导航栏隐藏 下一级页面显示,pop回来显示白条
    ios开发之--令UITableView滚动到指定位置
    Selenium 异常处理
    Selenium 选项卡管理
  • 原文地址:https://www.cnblogs.com/HDK2016/p/10208797.html
Copyright © 2020-2023  润新知