Подавите ошибку с оператор в PHP

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

68
задан VolkerK 26 April 2010 в 23:17
поделиться

13 ответов

Я подавил бы ошибку и обработал бы ее . Иначе Вы можете иметь проблема TOCTOU (Время проверки, время использования. Например, файл может быть удален после того, как file_exists возвращает true, но прежде fopen).

, Но я только подавил бы ошибки заставить их уйти. Они лучше быть видимым.

25
ответ дан Paweł Hajdan 24 November 2019 в 14:02
поделиться

Я использую его при попытке загрузить файл HTML для обработки как объект DOMDocument. Если существуют какие-либо проблемы в HTML... и что веб-сайт не имеет по крайней мере один ... DOMDocument-> loadHTMLFile () бросит ошибку, если Вы не подавите его с. Это - единственный путь (возможно, существуют лучшие), я когда-либо был успешен в создании скребков HTML в PHP.

-1
ответ дан Steve Paulo 24 November 2019 в 14:02
поделиться

Вы не хотите подавлять все, так как это замедляет Ваш сценарий.

И да существует путь и в php.ini и в рамках Вашего сценария для удаления ошибок (но только сделать это, когда Вы находитесь в продуктивной среде и регистрируете свои ошибки от php)

<?php
    error_reporting(0);
?>

И можно читать это для версии php.ini выключения его.

1
ответ дан Ólafur Waage 24 November 2019 в 14:02
поделиться

Одно место я использую его, находится в коде сокета, например, если Вам установят тайм-аут, то Вы получите предупреждение на этом, если Вы не будете включать, даже при том, что это допустимо для не получения пакета.

$data_len = @socket_recvfrom( $sock, $buffer, 512, 0, $remote_host, $remote_port )
2
ответ дан Don Neufeld 24 November 2019 в 14:02
поделиться

Используя иногда продуктивный счетчик. По моему опыту, необходимо всегда выключать сообщение об ошибке в php.ini или вызове

error_reporting(0);

на месте производства. Таким образом, когда Вы находитесь в разработке, можно просто прокомментировать строку и сохранить ошибки видимыми для отладки.

3
ответ дан Eric Lamb 24 November 2019 в 14:02
поделиться

Ошибочного подавления нужно избежать, если Вы не знаете , можно обработать все условия.

Это может быть намного более твердо, чем это смотрит сначала.

то, Что действительно необходимо сделать, полагаются на "error_log" php, чтобы быть методом создания отчетов, поскольку Вы не можете полагаться на пользователей просматривающие страницы для создания отчетов об ошибках. (И необходимо также отключить php от отображения этих ошибок)

Тогда, по крайней мере, у Вас будет всесторонний отчет обо всех вещах, идущих не так, как надо в системе.

, Если действительно необходимо обработать ошибки, можно создать пользовательский обработчик ошибок

http://php.net/set-error-handler

Тогда, Вы могли возможно отправить исключения (который может быть обработан), и сделайте что-либо, должны были сообщить странные ошибки администрированию.

6
ответ дан Kent Fredric 24 November 2019 в 14:02
поделиться

Если Вы не хотите предупреждение, брошенное при использовании функций как fopen (), можно подавить ошибку, но использовать исключения:

try {
    if (($fp = @fopen($filename, "r")) == false) {
        throw new Exception;
    } else {
        do_file_stuff();
    }
} catch (Exception $e) {
    handle_exception();
}
13
ответ дан dirtside 24 November 2019 в 14:02
поделиться

Да подавление имеет смысл.

, Например, fopen() возвраты команды FALSE, если файл не может быть открыт. Это прекрасно, но это также производит предупреждающее сообщение PHP. Часто Вы не хотите предупреждение - Вы проверите на FALSE сами.

На самом деле руководство PHP конкретно предлагает использовать в этом случае!

18
ответ дан Jason Cohen 24 November 2019 в 14:02
поделиться

нет ли способа подавить от предупреждений php.ini и ошибок? в этом случае можно отладить только изменение флага и не попытку к обнаружению, которое скрывает проблему.

3
ответ дан Enrico Murru 24 November 2019 в 14:02
поделиться

Что ж, при преобразовании из двоичного в десятичное вам действительно не нужны ВСЕ двоичные биты одновременно. Вам просто нужны биты, мощность которых вы в настоящее время вычисляете, и, возможно, двойная переменная для хранения результатов. Вы можете поместить двоичное значение в массив, скажем, i [64], перебрать его, получить мощность в зависимости от его положения и продолжать добавлять его к двойному.

в настоящее время может вызывать только ту ошибку, которую вы видите; однако, когда вы изменяете код, на который опирается подавленная строка, или среду, в которой она выполняется, тогда есть все шансы, что строка попытается вывести ошибку, совершенно отличную от той, которую вы пытались игнорировать. Тогда как отследить ошибку, которая не выводится? Добро пожаловать в ад отладки!

Мне потребовалось много лет, чтобы понять, сколько времени я трачу каждые пару месяцев из-за подавленных ошибок. Чаще всего (но не исключительно) это происходило после установки стороннего скрипта / приложения / библиотеки, в которых не было ошибок в среде разработчиков, но не у меня из-за разницы в конфигурации php или сервера или отсутствия зависимости, которая обычно немедленно выводила бы ошибку предупреждение о том, в чем проблема, но не когда разработчик добавляет волшебный @.

Альтернативы (в зависимости от ситуации и желаемого результата):
Обработать фактическую ошибку, о которой вы знаете, так что если фрагмент кода может вызвать определенную ошибку, он не запускается в этой конкретной ситуация. Но я думаю, что вы поняли эту часть, и вы просто беспокоились о том, что конечные пользователи видят ошибки, и это то, к чему я сейчас обращусь.

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

Для фатальных ошибок отключите display_errors (ваш обработчик ошибок по-прежнему запускается) в вашем php.ini и включите ведение журнала ошибок. Если у вас есть сервер разработки, а также живой сервер (что я рекомендую), то этот шаг не подходит. t необходим на вашем сервере разработки, поэтому вы все равно можете отлаживать эти фатальные ошибки, не прибегая к просмотру файла журнала ошибок. Есть даже трюк с использованием функции выключения для отправки большого количества фатальных ошибок обработчику ошибок.

В итоге:
Пожалуйста, избегайте этого. Для этого может быть веская причина, но я еще не видел ее, так что до этого дня я считаю, что оператор подавления ошибок (@) - зло.

Вы можете прочитать мой комментарий к ошибке Если вам нужна дополнительная информация, страница Control Operators в руководстве по PHP.

Вкратце:
Пожалуйста, избегайте этого. Для этого может быть веская причина, но я еще не видел ее, так что до этого дня я считаю, что оператор подавления ошибок (@) - зло.

Вы можете прочитать мой комментарий к ошибке Если вам нужна дополнительная информация, страница Control Operators в руководстве по PHP.

Вкратце:
Пожалуйста, избегайте этого. Для этого может быть веская причина, но я еще не видел ее, так что до этого дня я считаю, что оператор подавления ошибок (@) - зло.

Вы можете прочитать мой комментарий к ошибке Если вам нужна дополнительная информация, страница Control Operators в руководстве по PHP.

117
ответ дан 24 November 2019 в 14:02
поделиться

Я НИКОГДА не позволяю себе использовать '@' ... период.

Когда я обнаруживаю использование '@' в коде, я добавляю комментарии, чтобы сделать его очевидным, как в точке использования, так и в блоке документации вокруг функции, в которой он используется. Меня тоже укусила отладка «в погоне за призраком» из-за такого типа подавления ошибок, и я надеюсь облегчить задачу следующему человеку, выделив его использование, когда я его найду.

В тех случаях, когда я хочу мой собственный код для выдачи исключения, если встроенная функция PHP обнаруживает ошибку, и '@' кажется простым способом, вместо этого я предпочитаю сделать что-то еще, что дает тот же результат, но (снова) явно очевиден в код:

$orig = error_reporting(); // capture original error level
error_reporting(0);        // suppress all errors
$result = native_func();   // native_func() is expected to return FALSE when it errors
error_reporting($orig);    // restore error reporting to its original level
if (false === $result) { throw new Exception('native_func() failed'); }

Это '

7
ответ дан 24 November 2019 в 14:02
поделиться

Единственное место, где мне действительно нужно было его использовать, - это функция eval. Проблема с eval заключается в том, что, когда строка не может быть проанализирована из-за синтаксической ошибки, eval не возвращает false, а скорее выдает ошибку, как и при ошибке синтаксического анализа в обычном скрипте. Чтобы проверить, поддается ли синтаксическому анализу сценарий, хранящийся в строке, вы можете использовать что-то вроде:

$script_ok = @eval('return true; '.$script);

AFAIK, это наиболее элегантный способ сделать это.

3
ответ дан 24 November 2019 в 14:02
поделиться

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

Напишите 3 функции и вызовите вот так.

# supress error for this statement
supress_error_start();  
$mail_sent = mail($EmailTo, $Subject, $message,$headers);
supress_error_end(); #Don't forgot to call this to restore error.  

function supress_error_start(){
    set_error_handler('nothing');
    error_reporting(0);
}

function supress_error_end(){
    set_error_handler('my_err_handler');
    error_reporting('Set this to a value of your choice');
}

function nothing(){ #Empty function
}

function my_err_handler('arguments will come here'){
      //Your own error handling routines will come here
}
0
ответ дан 24 November 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: