2013-06-15 5 views
1

После того, как у меня есть аргумент с моей командой, потому что у всех нас разные взгляды на такую ​​ситуацию. Когда действительно приемлемо отключать сообщения об ошибках PHP или подавлять некоторые функции, которые бросают предупреждения, уведомления по любой причине ..Выключить или обработать ошибки в рабочей среде?

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

$Var = "Variable Is Set"; 

if (@$Var){ echo $Var; } 

За:

if (isset($Var)){ echo $Var; } 

Поскольку мы имеем переменную набора, это будет успешно эхо .. В то время как если бы мы не делали есть переменная набора, это будет бросать уведомление .. Так какой из них использовать? Иссете или подавление ошибок?

И в производственной среде, какой из них более приемлемо использовать?

error_reporting(0); 

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

или:

set_error_handler(""); 

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

Итак, мой общий вопрос?

Учитывайте ошибки в рабочей среде или просто отключите их вообще? Это сводится к лучшим практикам и предпочтениям, которые я предполагаю. Но это то, что озадачивает меня и мою команду до разногласий.

+0

Первый вопрос этого вопроса - это дубликат http://stackoverflow.com/questions/2600312/issetvar-vs-var – Greg

+1

Если ваша команда любит отключать отчет об ошибках в производстве, я бы показал им [это picture] (http://www.ostrichheadinsand.com/images/ostrich-head-in-sand.jpg) и высмеивать их хромоту. – goat

+0

@chris Вы только что выиграли интернет! –

ответ

3

К сожалению, это не определенное решение, но после нескольких лет проб и ошибок, я придумал следующие методы, которые только мое собственное, и работают очень хорошо:

1 - Никогда не используйте @ для подавления ошибок. Никогда не используйте ничего, чтобы слепо скрывать или игнорировать все ошибки. ВСЕ ошибки важны, никакая ошибка не должна игнорироваться.

2 - Сделайте так, как предложила RafaSashi, включите ведение журнала ошибок и отключите ошибки отображения.

3 - Активируйте ВСЕ отчет об ошибках, используя error_reporting = 2147483647 в PHP.INI. Это сделает PHP очень придирчивым к чему-либо, что вы можете сделать неправильно, помогая вам узнать больше и не отставать от будущих языковых разочарований и изменений.

4 - Вы также можете создать собственное ведение журнала ошибок, чтобы регистрировать именно то, что вы хотите, как хотите. Посмотрите руководство для error_log(). Если вы его используете, вы можете даже отключиться и начать вручную, что даст вам полный контроль над системой регистрации ошибок PHP.

5 - Я использую ООП во всем моем PHP-коде, поэтому я использую исключения везде, и я рекомендую то же самое для всех. Они на много лет опережают просто обработку ошибок. Используйте этот код для перехвата всех ошибок в коде и бросить их в качестве исключения:

set_error_handler('ErrorHandler'); 
function ErrorHandler($Code, $Message) 
{ 
    throw new Exception($Message, $Code); 
} 

6 - Не предъявляя никаких ошибок к пользователю просто нонсенс. Должны быть показаны некоторые ошибки, некоторые должны быть скрыты, а некоторые должны отображаться как общая проблема (не говорите пользователю, в чем именно проблема).

a) Ошибки, которые должны быть показаны: все, вызванное пользователем, например, неправильный ввод формы или неправильное поведение. Это совершенно очевидно, но следует упомянуть.

b) Ошибки, которые должны быть скрыты: скрыть только те ошибки, которые ваш код может обрабатывать и исправлять. Например, вы можете подключиться к БД, и если это не удается, вы можете попробовать еще раз. Если вторая попытка удалась, идите вперед, никто не должен знать, что первая попытка не удалась. Просто зарегистрируйте его, если хотите, используя error_log(). Иногда переменные еще не существуют, поэтому проверьте это с помощью isset() и при необходимости инициализируйте их. Не нужно сообщать об этом как об ошибке.

c) Ошибки, которые должны быть указаны как общие: большинство ошибок попадет в эту категорию. Вы не будете показывать пользовательские вещи, например, из-за нехватки памяти PHP, или что SMTP-сервер отключен, или что соединение с БД было отклонено. Просто узнайте, как обернуть опасный код с помощью try, используйте catch для захвата любой ошибки и преобразуйте сообщение в то, что вы можете показать пользователю. Пример:

try 
{ 
    // Dangerous code ahead: we will try to connect to the database, but it 
    // can be offline. 
    $mysqli = new mysqli("localhost", "user", "password", "database"); 
} 
catch(Exception $e) 
{ 
    // If we're here, something bad happened during connection. Let's handle it. 

    // Notify staff, log error, do anything you can to get someone to quickly 
    // check the issue. 
    SendMailAdmin("Database connection Error, check ASAP."); 
    error_log("Database connection Error, check ASAP."); 

    // And show the user some message. You don't need to tell him about any 
    // detail regarding what truly caused the error. 
    die("A problem occurred in our servers. Our technical staff has been notified, 
     please try again in a few minutes."); 
} 

// If we're here, everything worked fine, so do your DB query and so on.... 

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

7 - Это более продвинутый, но вы можете сделать это также: создать вам собственную иерархию исключений, как это:

class MVXException extends Exception {} 
    class ExMVXDB extends MVXException {} 
     class ExMVXDBRead extends ExMVXDB { } 
     class ExMVXDBWrite extends ExMVXDB { } 
     class ExMVXDBNotFound extends ExMVXDB { } 

Это является упрощение дерева исключений у меня в самодельном рамках , Красота заключается в том, что если вы сделаете catch(ExMVXDB $e), вы поймаете ВСЕ ошибки БД. Но если вы хотите поймать только операцию записи данных, вы можете сделать catch(ExMVXDBWrite $e).

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

1

1 - Вы можете отключить display_errors и включите log_errors

@ini_set('log_errors','On'); 

@ini_set('display_errors','Off'); 

2 - Вы можете использовать PHP по умолчанию ошибок и журналирование Функционирует & константы

См: http://www.w3schools.com/php/php_ref_error.asp

3 - Вы может реализовать собственный набор функций ошибок и ведения журнала с файловой системой PHP

См.: http://www.w3schools.com/php/php_ref_filesystem.asp

+3

W3Schools - ужасный ресурс. Вместо этого я предлагаю использовать официальные документы PHP. –

+0

Как суровый, как это звучит. Это немного информативно для опытных пользователей. Хотя я знаю о методах, которые вы дали. -1 для использования W3School, так как это недостоверно достойно –

5

Вы никогда просто выключите ошибка, сообщающая полностью. You do выключить отображение ошибок.Непосредственные ошибки сброса на экран необходимы во время разработки (если у вас нет других методов, которые бросают все ошибки на вашем лице), в производстве вы хотите получить ту же ошибку , сообщив, но вместо того, чтобы выводить видимые ошибки, вы хотите, чтобы они регистрировали их только , Все это можно сделать с помощью настроек конфигурации отчетов об ошибках PHP.

Если вы хотите специальную обработку/регистрацию ошибок, используйте специальный обработчик ошибок.

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

Смежные вопросы