如何在codeigniter中抑制通知错误?

时间:2014-04-22 08:59:00

标签: php codeigniter

我想在某个cronjob期间抑制codeigniter错误日志中的通知。我已尝试在该行前使用@,但它仍会在日志中打印通知:

这是生成通知的行:

@$resultarray[1][2]++;

通知: ...严重性:通知 - >未定义的偏移量:1 ...

我在这里做错了什么?

(我很好地使用它,所以请不要声称不使用@的消息,谢谢:))

5 个答案:

答案 0 :(得分:6)

要让PHP报告除E_Notice之外的所有错误,请调用PHP error_reporting函数,如下所示:

error_reporting(E_ALL & ~E_NOTICE);

我认为最好的方法是在应用程序的根目录配置index.php,首先检测应用程序环境,然后有条件地设置报告的PHP错误。

的index.php

if (defined('ENVIRONMENT'))
{
  switch (ENVIRONMENT)
  {
    case 'development':
    case 'testing':
    case 'staging':
      error_reporting(E_ALL & ~E_NOTICE);
    break;

    case 'production':
      error_reporting(0);
    break;

    default:
      exit('The application environment is not set correctly.');
  }
}

有关更多配置选项,请参阅有关error_reporting函数的官方PHP Documentation

或者,您可以在您正在使用的特定文件(无论您的cron作业调用)中调用error_reporting函数,并使用您在index.php中设置的内容覆盖配置。这是一个使用控制器的简单示例:

class Sample_Controller extends CI_Controller {

  public function __construct()
  {
    parent::__construct();
    error_reporting(E_ALL & ~E_NOTICE);
  }

}

答案 1 :(得分:3)

在system / core / Common.php中

function _exception_handler($severity, $message, $filepath, $line)
{
     // We don't bother with "strict" notices since they tend to fill up
     // the log file with excess information that isn't normally very helpful.
     // For example, if you are running PHP 5 and you use version 4 style
     // class functions (without prefixes like "public", "private", etc.)
     // you'll get notices telling you that these have been deprecated.
    if ($severity == E_STRICT || !error_reporting()) // <-- add || !error_reporting()
    {
        return;
    }

    $_error =& load_class('Exceptions', 'core');

    // Should we display the error? We'll get the current error_reporting
    // level and add its bits with the severity bits to find out.
    if (($severity & error_reporting()) == $severity)
    {
        $_error->show_php_error($severity, $message, $filepath, $line);
    }

    // Should we log the error?  No?  We're done...
    if (config_item('log_threshold') == 0)
    {
        return;
    }

    $_error->log_exception($severity, $message, $filepath, $line);
}

}

添加|| !error_reporting(),CodeIgniter不会记录带有错误控制操作符@的表达式。

答案 2 :(得分:0)

直接从docs

<?php

// Turn off all error reporting
error_reporting(0);

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

?>

在你的php.ini评论中,

error_reporting = E_ALL & ~E_NOTICE
error_reporting = E_ALL & ~E_NOTICE | E_STRICT
error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ER… _ERROR
error_reporting = E_ALL & ~E_NOTICE

答案 3 :(得分:0)

来自http://php.net/manual/en/language.operators.errorcontrol.php

  

如果使用set_error_handler()设置了自定义错误处理函数   然后它仍然会被调用,但这个自定义错误处理程序可以(和   应该)调用error_reporting(),当调用时返回0   触发错误之前是@。

然而,CodeIgniter 2并没有这样做。为了隐藏CodeIgniter中的@suppressed错误,您需要编辑_exception_handler中的system/core/Common.php函数,以便在开头包含这些行:

if (error_reporting() == 0) {
  return;
}

根据上面的链接,如果触发错误的调用前面有@,error_reporting()将返回0。此代码将检查此问题,并阻止CodeIgniter记录此类错误。

答案 4 :(得分:0)

转到config / constants然后设置         defined('SHOW_DEBUG_BACKTRACE')或define('SHOW_DEBUG_BACKTRACE',TRUE);到         defined('SHOW_DEBUG_BACKTRACE')或define('SHOW_DEBUG_BACKTRACE',FALSE);