PHP: Как правильно управлять ошибками? - PullRequest
3 голосов
/ 02 марта 2010

Если не удается получить доступ к чему-либо в Интернете (API, база данных), как мне прекратить выполнение остальной части сценария и занести ошибку в файл журнала?Ну, и чтобы посетитель не увидел точную причину, а увидел бы мое обычное сообщение (скажем, «Просто случилось что-то плохое»).Какие шаги мне нужно предпринять, чтобы все устроить?

Ответы [ 2 ]

11 голосов
/ 02 марта 2010

Мне обычно нравится использовать Исключения в такой ситуации: это позволяет мне хранить весь код обработки ошибок в одном месте.


Например, я бы использовал что-то вроде этого:

try {
    // Some code

    // Some code that throws an exception

    // Some other code -- will not be executed when there's been an Exception

} catch (Exception $e) {
    // Log the technical error to file / database

    // Display a nice error message
}

При этом весь код обработки ошибок находится в блоке catch - и не разбросан по всему моему приложению.


Обратите внимание, что многие функции PHP не выдают исключений, а только выдают предупреждение или ошибку ...

Для них вы можете использовать set_error_handler, чтобы определить свой собственный обработчик ошибок - который может вызвать исключение ;-)
Например, см. Пример на странице справочника ErrorException.

Хотя для многих ошибок / предупреждений это будет работать очень хорошо, следует помнить, что оно не будет работать для Parse Error и Fatal Error:

  • Первый тип фактически вызывается до того, как код PHP на самом деле выполняется
  • И второй вид ... ну ... Фатальный.


И я бы никогда не поместил ни die, ни exit в середину моего кода: это, на мой взгляд, один из худших возможных способов устранения ошибок.

Я бы также настроил свой сервер / приложение так:

  • Сообщения об ошибках не выводятся на выходе, настройка display_errors на Off.
  • Ошибки записываются в файл, используя log_errors и error_log.
3 голосов
/ 02 марта 2010

и чтобы посетитель не видел точная причина, а скорее они будут см. мое специальное сообщение

Я бы посоветовал вам прочесть эту прекрасную статью Дэвида Уолша о пользовательской обработке ошибок в PHP .

Для этого можно использовать функцию set_error_handler () .

как бы мне прекратить казнить остальных сценарий и зарегистрируйте ошибку в файл журнала?

По умолчанию в PHP есть функция для регистрации ошибок; error_log

Пример из PHP.net:

<?php
// Send notification through the server log if we can not
// connect to the database.
if (!Ora_Logon($username, $password)) {
    error_log("Oracle database not available!", 0);
    exit; //exit
}

// Notify administrator by email if we run out of FOO
if (!($foo = allocate_new_foo())) {
    error_log("Big trouble, we're all out of FOOs!", 1,
               "operator@example.com");
}

// another way to call error_log():
error_log("You messed up!", 3, "/var/tmp/my-errors.log");
?>

.

Дополнительные ресурсы:

Это также хорошая статья, большая часть которой относится к обработке ошибок.

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