@ оператор подавления ошибок и set_error_handler - PullRequest
15 голосов
/ 11 сентября 2011

Я следую хорошим правилам программирования и записываю ошибки PHP в файл, а не показываю их пользователю.Я использую set_error_handler() для этого.

Теперь проблема.Например, у меня где-то есть:

@file_exists('/some/file/that/is/outside/openbasedir.txt');

Но, несмотря на оператор подавления ошибок, сообщение об ошибке записывается в журнал.Я не хочу этогоЯ хочу, чтобы подавленные ошибки не передавались моему обработчику ошибок.

Ответы [ 3 ]

26 голосов
/ 11 сентября 2011

Оператор @ временно устанавливает error_reporting равным 0, поэтому вы можете проверить значение error_reporting в своем обработчике ошибок:

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

Или, что еще лучше, регистрируйте только те типы ошибок, которые содержатся в error_reporting:

$error_reporting = ini_get('error_reporting');

if ( !($error_reporting & $errno) ) {
    return;
}

Также обратите внимание на параметры log_errors и error_log для автоматической регистрации ошибок в файле или системном журнале.

3 голосов
/ 28 декабря 2018

Решение, которое также работает для PHP 7

Согласно документации PHP:

Если вы установили пользовательскую функцию обработчика ошибок с помощью set_error_handler (), то она все равно будет вызываться, но этот пользовательский обработчик ошибок может (и должен) вызывать error_reporting (), которая будет возвращать 0, когда вызову, вызвавшему ошибку, предшествовал на @.

Источник: http://php.net/manual/en/language.operators.errorcontrol.php

Таким образом, вы можете использовать следующий код в вашем обработчике ошибок:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    if (error_reporting() == 0) {
        /// @ sign temporary disabled error reporting
        return;
    }

    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

set_error_handler("exception_error_handler");
1 голос
/ 11 сентября 2011

Вы должны избегать использования оператора @.Прежде всего, он медленный, и я бы даже назвал его вредным.

То, что вы должны иметь вместо этого, в файле php.ini имеет две строки:

error_repoting = E_ALL | E_STRICT
display_errors = Off

... или, если у вас нет доступа к файлу php.ini, в верхней части index.php (или любого другого файла начальной загрузки) вы должны добавить:

error_reporting( E_ALL | E_STRICT );
ini_set('display_errors', 0);
...