Как правильно завершить страницу PHP после того, как исключение выдается и перехватывается? - PullRequest
2 голосов
/ 08 ноября 2011

Я работаю над своим первым крупным приложением PHP / MySQL.Я использую механизм обработки исключений для обработки возможных ошибок БД.На некоторых страницах я использую несколько запросов для получения соответствующих данных из базы данных.Часть страницы, посвященная этим запросам, находится в одном блоке try-catch, и я пишу настраиваемое сообщение об ошибке в блоке catch.Моя проблема: запросы находятся в разных блоках на моей странице, и когда выдается исключение из БД, обработка немедленно переходит к блоку catch и делает невозможным отображение страницы в допустимом XHTML, поскольку в блоке catch она неизвестнакакие XHTML-теги должны быть закрыты.Я думал о перенаправлении на пользовательскую страницу с сообщением об ошибке, но некоторые люди не одобряют это.Я думаю, что это должно быть довольно тривиальным вопросом, но интересно, какова рекомендуемая практика.Надеюсь на некоторые подсказки!

Ответы [ 4 ]

1 голос
/ 08 ноября 2011

Вы должны использовать ob_start (), чтобы начать буферизацию вывода, а затем вы закончили рендеринг всего HTML, используйте ob_flush (), чтобы отправить HTML-код пользователю.Если произошла ошибка, вы можете сгенерировать специальную страницу, вызвав ob_clean () для очистки буфера, а затем отобразить свою страницу ошибки.

Пример:

ob_start();

echo "My title";

try{
   $myDB = Database::getInstance();
   $userName = $myDB->query("SELECT name FROM user"); // send an exception
   echo "Welcome ".$userName;
} catch (Exception $e) {
   ob_clean();
   echo "Error, please try again";
}

ob_flush();
1 голос
/ 08 ноября 2011

1) Изменить обработчик ошибок по умолчанию.Зарегистрируйте их в базе данных

2) используйте буферизацию вывода

3) последнюю строку вашего блока Catch {}, сделайте так, чтобы заголовок ("location: error.html") перенаправлялсяуниверсальный обработчик ошибок.

0 голосов
/ 08 ноября 2011

Я использовал методы ob_Start (), ob_flush () и ob_clean (), и он делает то, что я исключил, поэтому я продолжаю использовать это.Я задаюсь вопросом, считается ли это хорошей практикой, всегда следует избегать создания неверного XHTML.Конечно, ошибка в запросе - это ошибка, и можно спорить, следует ли это обрабатывать в рабочем коде.Но я предполагаю, что в будущем будет сделано много обслуживания, и ошибки будут неизбежны.И они должны быть представлены как можно лучше и, конечно, не в виде белого пустого экрана ...

0 голосов
/ 08 ноября 2011

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

Итак, если исключение БД даже появилось, я регистрирую его (используя простой error_log, включая полные данные запроса, get, post, url, referrer) и показываю страницу 500 ошибок без какого-либо перенаправления. Я думаю, что перенаправление является плохой практикой - вы не можете обновить страницу и повторить ошибку, посетители и QA не могут отправить вам недействительную ссылку на страницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...