Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Я подавил бы ошибку и обработал бы ее . Иначе Вы можете иметь проблема TOCTOU (Время проверки, время использования. Например, файл может быть удален после того, как file_exists возвращает true, но прежде fopen).
, Но я только подавил бы ошибки заставить их уйти. Они лучше быть видимым.
Я использую его при попытке загрузить файл HTML для обработки как объект DOMDocument. Если существуют какие-либо проблемы в HTML... и что веб-сайт не имеет по крайней мере один ... DOMDocument-> loadHTMLFile () бросит ошибку, если Вы не подавите его с. Это - единственный путь (возможно, существуют лучшие), я когда-либо был успешен в создании скребков HTML в PHP.
Вы не хотите подавлять все, так как это замедляет Ваш сценарий.
И да существует путь и в php.ini и в рамках Вашего сценария для удаления ошибок (но только сделать это, когда Вы находитесь в продуктивной среде и регистрируете свои ошибки от php)
<?php
error_reporting(0);
?>
И можно читать это для версии php.ini выключения его.
Одно место я использую его, находится в коде сокета, например, если Вам установят тайм-аут, то Вы получите предупреждение на этом, если Вы не будете включать, даже при том, что это допустимо для не получения пакета.
$data_len = @socket_recvfrom( $sock, $buffer, 512, 0, $remote_host, $remote_port )
Используя иногда продуктивный счетчик. По моему опыту, необходимо всегда выключать сообщение об ошибке в php.ini или вызове
error_reporting(0);
на месте производства. Таким образом, когда Вы находитесь в разработке, можно просто прокомментировать строку и сохранить ошибки видимыми для отладки.
Ошибочного подавления нужно избежать, если Вы не знаете , можно обработать все условия.
Это может быть намного более твердо, чем это смотрит сначала.
то, Что действительно необходимо сделать, полагаются на "error_log" php, чтобы быть методом создания отчетов, поскольку Вы не можете полагаться на пользователей просматривающие страницы для создания отчетов об ошибках. (И необходимо также отключить php от отображения этих ошибок)
Тогда, по крайней мере, у Вас будет всесторонний отчет обо всех вещах, идущих не так, как надо в системе.
, Если действительно необходимо обработать ошибки, можно создать пользовательский обработчик ошибок
http://php.net/set-error-handler
Тогда, Вы могли возможно отправить исключения (который может быть обработан), и сделайте что-либо, должны были сообщить странные ошибки администрированию.
Если Вы не хотите предупреждение, брошенное при использовании функций как fopen (), можно подавить ошибку, но использовать исключения:
try {
if (($fp = @fopen($filename, "r")) == false) {
throw new Exception;
} else {
do_file_stuff();
}
} catch (Exception $e) {
handle_exception();
}
Да подавление имеет смысл.
, Например, fopen()
возвраты команды FALSE
, если файл не может быть открыт. Это прекрасно, но это также производит предупреждающее сообщение PHP. Часто Вы не хотите предупреждение - Вы проверите на FALSE
сами.
На самом деле руководство PHP конкретно предлагает использовать в этом случае!
нет ли способа подавить от предупреждений php.ini и ошибок? в этом случае можно отладить только изменение флага и не попытку к обнаружению, которое скрывает проблему.
Что ж, при преобразовании из двоичного в десятичное вам действительно не нужны ВСЕ двоичные биты одновременно. Вам просто нужны биты, мощность которых вы в настоящее время вычисляете, и, возможно, двойная переменная для хранения результатов. Вы можете поместить двоичное значение в массив, скажем, i [64], перебрать его, получить мощность в зависимости от его положения и продолжать добавлять его к двойному.
в настоящее время может вызывать только ту ошибку, которую вы видите; однако, когда вы изменяете код, на который опирается подавленная строка, или среду, в которой она выполняется, тогда есть все шансы, что строка попытается вывести ошибку, совершенно отличную от той, которую вы пытались игнорировать. Тогда как отследить ошибку, которая не выводится? Добро пожаловать в ад отладки!Мне потребовалось много лет, чтобы понять, сколько времени я трачу каждые пару месяцев из-за подавленных ошибок. Чаще всего (но не исключительно) это происходило после установки стороннего скрипта / приложения / библиотеки, в которых не было ошибок в среде разработчиков, но не у меня из-за разницы в конфигурации php или сервера или отсутствия зависимости, которая обычно немедленно выводила бы ошибку предупреждение о том, в чем проблема, но не когда разработчик добавляет волшебный @.
Альтернативы (в зависимости от ситуации и желаемого результата):
Обработать фактическую ошибку, о которой вы знаете, так что если фрагмент кода может вызвать определенную ошибку, он не запускается в этой конкретной ситуация. Но я думаю, что вы поняли эту часть, и вы просто беспокоились о том, что конечные пользователи видят ошибки, и это то, к чему я сейчас обращусь.
Для обычных ошибок вы можете настроить обработчик ошибок, чтобы они выводились так, как вы хотите, когда это вы просматриваете страницу, но скрыты от конечных пользователей и регистрируются, чтобы знать, какие ошибки запускают ваши пользователи.
Для фатальных ошибок отключите display_errors
(ваш обработчик ошибок по-прежнему запускается) в вашем php.ini и включите ведение журнала ошибок. Если у вас есть сервер разработки, а также живой сервер (что я рекомендую), то этот шаг не подходит. t необходим на вашем сервере разработки, поэтому вы все равно можете отлаживать эти фатальные ошибки, не прибегая к просмотру файла журнала ошибок. Есть даже трюк с использованием функции выключения для отправки большого количества фатальных ошибок обработчику ошибок.
В итоге:
Пожалуйста, избегайте этого. Для этого может быть веская причина, но я еще не видел ее, так что до этого дня я считаю, что оператор подавления ошибок (@) - зло.
Вы можете прочитать мой комментарий к ошибке Если вам нужна дополнительная информация, страница Control Operators в руководстве по PHP.
Вкратце:
Пожалуйста, избегайте этого. Для этого может быть веская причина, но я еще не видел ее, так что до этого дня я считаю, что оператор подавления ошибок (@) - зло.
Вы можете прочитать мой комментарий к ошибке Если вам нужна дополнительная информация, страница Control Operators в руководстве по PHP.
Вкратце:
Пожалуйста, избегайте этого. Для этого может быть веская причина, но я еще не видел ее, так что до этого дня я считаю, что оператор подавления ошибок (@) - зло.
Вы можете прочитать мой комментарий к ошибке Если вам нужна дополнительная информация, страница Control Operators в руководстве по PHP.
Я НИКОГДА не позволяю себе использовать '@' ... период.
Когда я обнаруживаю использование '@' в коде, я добавляю комментарии, чтобы сделать его очевидным, как в точке использования, так и в блоке документации вокруг функции, в которой он используется. Меня тоже укусила отладка «в погоне за призраком» из-за такого типа подавления ошибок, и я надеюсь облегчить задачу следующему человеку, выделив его использование, когда я его найду.
В тех случаях, когда я хочу мой собственный код для выдачи исключения, если встроенная функция 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'); }
Это '
Единственное место, где мне действительно нужно было его использовать, - это функция eval. Проблема с eval заключается в том, что, когда строка не может быть проанализирована из-за синтаксической ошибки, eval не возвращает false, а скорее выдает ошибку, как и при ошибке синтаксического анализа в обычном скрипте. Чтобы проверить, поддается ли синтаксическому анализу сценарий, хранящийся в строке, вы можете использовать что-то вроде:
$script_ok = @eval('return true; '.$script);
AFAIK, это наиболее элегантный способ сделать это.
Если вы используете настраиваемую функцию обработки ошибок и хотите подавить ошибку (возможно, известную ошибку), используйте этот метод. Использование '@' в этом контексте не является хорошей идеей, поскольку оно не подавляет ошибку, если установлен обработчик ошибок.
Напишите 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
}