Подавить ошибку с помощью оператора @ в PHP - PullRequest
67 голосов
/ 26 сентября 2008

Как вы считаете, когда-либо допустимо использовать оператор @ для подавления ошибки / предупреждения в PHP, тогда как вы, возможно, обрабатываете ошибку?

Если да, то при каких обстоятельствах вы бы это использовали?

Примеры кода приветствуются.

Редактировать: Примечание для ответчиков. Я не хочу отключать отчеты об ошибках, но, например, обычной практикой является использование

@fopen($file);

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

if (file_exists($file))
{
    fopen($file);
}
else
{
    die('File not found');
}

или аналогичный.

Я предполагаю, что вопрос - есть ли где-нибудь, что @ HAS должен использоваться для подавления ошибки, что НЕ МОЖЕТ быть обработан любым другим способом?

Ответы [ 15 ]

2 голосов
/ 26 сентября 2008

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

$data_len = @socket_recvfrom( $sock, $buffer, 512, 0, $remote_host, $remote_port )
1 голос
/ 26 сентября 2008

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

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

<?php
    error_reporting(0);
?>

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

0 голосов
/ 13 февраля 2019

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

Короче говоря, я нашел информацию для входа (имя пользователя и пароль в виде простого текста), записанную в трассировку журнала ошибок.

Здесь немного больше информации об этой проблеме.

Логика входа находится в своем собственном классе, потому что система должна предлагать разные механизмы входа. Из-за проблем миграции сервера произошла ошибка. Эта ошибка вывела всю трассировку в журнал ошибок, включая информацию о пароле! Один метод ожидал имя пользователя и пароль в качестве параметров, поэтому trace записал все верно в журнал ошибок.

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

В любом случае. Сообщения трассировки полезны, но в этом случае были просто вредны.

Урок, который я усвоил, как только заметил, что вывод трассировки: иногда подавление сообщения об ошибке на данный момент является полезной мерой пробела во избежание дальнейшего вреда.

По-моему, я не думал, что это плохой дизайн класса. Сама ошибка была вызвана исключением PDOException (проблема с отметкой времени при переходе с MySQL 5.6 на 5.7), которое просто выгружало все настройки PHP по умолчанию в журнал ошибок.

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

0 голосов
/ 16 февраля 2010

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

Напишите 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 голосов
/ 26 сентября 2008

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

...