К сожалению, это не определенное решение, но после нескольких лет проб и ошибок, я придумал следующие методы, которые только мое собственное, и работают очень хорошо:
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)
.
Все. Обработка ошибок не проста, и нет прямого ответа, но есть множество инструментов и хороших практик, которые помогут вам выбрать то, что лучше для вас.
Первый вопрос этого вопроса - это дубликат http://stackoverflow.com/questions/2600312/issetvar-vs-var – Greg
Если ваша команда любит отключать отчет об ошибках в производстве, я бы показал им [это picture] (http://www.ostrichheadinsand.com/images/ostrich-head-in-sand.jpg) и высмеивать их хромоту. – goat
@chris Вы только что выиграли интернет! –