Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 633|回复: 0

***PHP中error_reporting()用法详解(含codeigniter框架中屏蔽错误提示的解决方案)

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-6-20 12:31:15 | 显示全部楼层 |阅读模式

    php中我们对错误的处理会常用到error_reporting函数了,大家可以看到最多的是error_reporting(E_ALL ^ E_NOTICE)了,这个到底什么意思呢,下面我来来看看。

     

    error_reporting() 函数规定报告哪个错误 。该函数设置当前脚本的错误报告级别。该函数返回旧的错误报告级别。

    首先要知道error_reporting()函数是用来设置错误级别并返回当前级别的。它有14个错误级别,如下:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    1    E_ERROR     致命的运行时错误。 错误无法恢复过来。脚本的执行被暂停
    2    E_WARNING    非致命的运行时错误。 脚本的执行不会停止
    4    E_PARSE     编译时解析错误。解析错误应该只由分析器生成
    8    E_NOTICE     运行时间的通知。
    16    E_CORE_ERROR   在PHP启动时的致命错误。这就好比一个在PHP核心的E_ERROR
    32    E_CORE_WARNING  在PHP启动时的非致命的错误。这就好比一个在PHP核心E_WARNING警告
    64    E_COMPILE_ERROR 致命的编译时错误。 这就像由Zend脚本引擎生成了一个E_ERROR
    128   E_COMPILE_WARNING 非致命的编译时错误,由Zend脚本引擎生成了一个E_WARNING警告
    256   E_USER_ERROR   致命的用户生成的错误。
    512   E_USER_WARNING  非致命的用户生成的警告。
    1024   E_USER_NOTICE  用户生成的通知。
    2048   E_STRICT     运行时间的通知。
     
    4096   E_RECOVERABLE_ERROR 捕捉致命的错误。
     
    8191   E_ALL来     所有的错误和警告。

    好像php默认是不开启错误的,所以你需要配置php.ini文件:

    将 display_errors = Off 改为display_errors = On

    另外还要配置错误级别:将

    error_reporting = E_ALL     改为:

    error_reporting = E_ALL & ~E_NOTICE

    应为php默认是显示所有错误的,而有些无害的提示我们不需要显示,所以设置如上!

    也可以在php代码运用如下:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    //禁用错误报告,也就是不显示错误
    error_reporting (0);
    //报告运行时错误
    error_reporting (E_ERROR | E_WARNING | E_PARSE);
    //报告所有错误
    error_reporting (E_ALL);
    ?>

    使用示例:

    今天学习CI框架过程中遇到个问题:

    ?
    1
    2
    3
    4
    A PHP Error was encountered
    Severity: Notice
     
    Message: Undefined variable: user

    一般在默认的普通PHP文件中输出一个未定义声明的变量是不会报错误的,但在codeigniter框架下却要报错误,这对于想集成 添加 和 修改 页面于一体的”懒人”很不方便,由于是初学者开始还想怎么在代码中屏蔽这一错误提示呢.甚至用到了@,但听很多人都说@会大大降低性能….

    最后突然想到,是不是codeigniter有意让这错误信息提示出来了呢,我们该如何去屏蔽掉这一类错误呢无意中搜索到了”如何让codeigniter不显示Notice信息?”,茅塞顿开.原来是入口index.php中的error_reporting(E_ALL);在作怪.只需要把它改成 
      error_reporting(E_ALL ^ E_NOTICE); 
    就可以屏蔽掉这个错误,而不影响其他的报错.

    我们在程序中可能经常看到这么一个函数

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function setErrorReporting()
    {
       //从配置文件读取当前是否为开发环境
       if (DEV_ENV == true) {
         ini_set ( "error_reprorting" , "E_ALL & ~E_NOTICE" );
         ini_set ( "display_errors" , "on" );
       } else {
         error_reporting (E_ALL);
         ini_set ( 'display_errors' , 'Off' );
         ini_set ( "log_errors" , "On" );
         ini_set ( 'error_log' , '/var/log/phperror.log' );
       }
    }

    举例说明:
    在Windows环境下:原本在php4.3.0中运行正常的程序,在4.3.1中为何多处报错,大体提示为:Notice:Undefined varialbe:变量名称.

    例如有如下的代码:
     代码如下 复制代码
    if (!$tmp_i) {
    $tmp_i=10;
    }
    在4.3.0中运行正常,在4.3.1中运行会提示Notice:Undefined varialbe:tmp_i
    问题如下:1.问题出在哪里?
    2.应如何修改这段代码?
    3.不改段代码,如何修改php.ini中的设置使原来在4.3.0中的程序在4.3.1的环境下运行正常而不出现这个错误提示.
    解决办法:

    在程序开头加一句:
     代码如下 复制代码
    error_reporting(E_ALL & ~E_NOTICE); 或error_reporting(E_ALL ^ E_NOTICE);
    或者修改php.ini:
     代码如下 复制代码
    error_reporting = E_ALL & ~E_NOTICE
    有关error_reporting()函数: error_reporting() 设置 PHP 的报错级别并返回当前级别。
    ; 错误报告是按位的。或者将数字加起来得到想要的错误报告等级。
    ; E_ALL - 所有的错误和警告
    ; E_ERROR - 致命性运行时错
    ; E_WARNING - 运行时警告(非致命性错)
    ; E_PARSE - 编译时解析错误
    ; E_NOTICE - 运行时提醒(这些经常是是你的代码的bug引起的,也可能是有意的行为造成的。(如:基于未初始化的变量自动初始化为一个空字符串的事实而使用一个未初始化的变量)
    ; E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误
    ; E_CORE_WARNING - 发生于PHP启动时初始化过程中的警告(非致命性错)
    ; E_COMPILE_ERROR - 编译时致命性错
    ; E_COMPILE_WARNING - 编译时警告(非致命性错)
    ; E_USER_ERROR - 用户产生的出错消息
    ; E_USER_WARNING - 用户产生的警告消息
    ; E_USER_NOTICE - 用户产生的提醒消息
    E_NOTICE 表示一般情形不记录,只有程式有错误情形时才用到,例如企图存取一个不存在的变数,或是呼叫 stat() 函式检视不存在的档案。
    E_WARNING 通常都会显示出来,但不会中断程式的执行。这对除错很有效。例如:用有问题的常规表示法呼叫 ereg()。
    E_ERROR 通常会显示出来,亦会中断程式执行。意即用这个遮罩无法追查到记忆体配置或其它的错误。
    E_PARSE 从语法中剖析错误。
    E_CORE_ERROR 类似 E_ERROR,但不包括 PHP 核心造成的错误。
    E_CORE_WARNING 类似 E_WARNING,但不包括 PHP 核心错误警告

    使用方法:
    error_reporting(0);//禁用错误报告
    error_reporting(E_ALL ^ E_NOTICE);//显示除去 E_NOTICE 之外的所有错误信息
    error_reporting(E_ALL^E_WARNING^E_NOTICE);//显示除去E_WARNING E_NOTICE 之外的所有错误信息
    error_reporting(E_ERROR | E_WARNING | E_PARSE);//显示运行时错误,与error_reporting(E_ALL ^ E_NOTICE);效果相同。error_reporting(E_ALL);//显示所有错误
    error_reporting(0)
    error_reporting(255);
    是列出所有提示
    error_reporting(0);
    是不显示所有提示
    建议使用
    error_reporting(7);
    只显示严重错误
    1 E_ERROR 致命的运行时错误
    2 E_WARNING 运行时警告(非致命性错误)
    4 E_PARSE 编译时解析错误
    8 E_NOTICE 运行时提醒(经常是bug,也可能是有意的)
    16 E_CORE_ERROR PHP启动时初始化过程中的致命错误
    32 E_CORE_WARNING PHP启动时初始化过程中的警告(非致命性错)
    64 E_COMPILE_ERROR 编译时致命性错
    128 E_COMPILE_WARNING 编译时警告(非致命性错)
    256 E_USER_ERROR 用户自定义的致命错误
    512 E_USER_WARNING 用户自定义的警告(非致命性错误)
    1024 E_USER_NOTICE 用户自定义的提醒(经常是bug,也可能是有意的)
    2048 E_STRICT 编码标准化警告(建议如何修改以向前兼容)
    4096 E_RECOVERABLE_ERROR 接近致命的运行时错误,若未被捕获则视同E_ERROR
    6143 E_ALL 除E_STRICT外的所有错误(PHP6中为8191,即包含所有)

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-23 14:59 , Processed in 0.064096 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表