Поиск…


Настройка отчетов об ошибках и их отображение

Если это еще не сделано в php.ini, отчет об ошибках может быть установлен динамически и должен быть настроен так, чтобы показывать большинство ошибок:

Синтаксис

int error_reporting ([ int $level ] )

Примеры

// should always be used prior to 5.4
error_reporting(E_ALL);

// -1 will show every possible error, even when new levels and constants are added 
// in future PHP versions. E_ALL does the same up to 5.4.
error_reporting(-1);

// without notices
error_reporting(E_ALL & ~E_NOTICE);

// only warnings and notices.
// for the sake of example, one shouldn't report only those
error_reporting(E_WARNING | E_NOTICE);

ошибки будут регистрироваться по умолчанию php, обычно в файле error.log на том же уровне, что и исполняемый скрипт.

в среде разработки можно также показать их на экране:

ini_set('display_errors', 1);

в производстве, однако, следует

ini_set('display_errors', 0);

и показать дружественное сообщение о проблеме с помощью обработчика исключений или ошибок.

Обработка исключений и ошибок

попробуй поймать

try..catch блоки могут использоваться для управления потоком программы, в которой могут быть try..catch Исключения . Их можно поймать и обработать изящно, а не останавливать PHP, когда вы столкнулись:

try {
    // Do a bunch of things...
    throw new Exception('My test exception!');
} catch (Exception $ex) {
    // Your logic failed. What do you want to do about that? Log it:
    file_put_contents('my_error_log.txt', $ex->getMessage(), FILE_APPEND);
}

Вышеприведенный пример catch бы Исключение, брошенное в блок try и зарегистрировавшее его сообщение («My test exception!») В текстовый файл.

Захват различных типов исключений

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

try {
    throw new InvalidArgumentException('Argument #1 must be an integer!');
} catch (InvalidArgumentException $ex) {
    var_dump('Invalid argument exception caught: ' . $ex->getMessage());
} catch (Exception $ex) {
    var_dump('Standard exception caught: ' . $ex->getMessage());
}

В приведенном выше примере первый catch будет использоваться, так как он совпадает с первым в порядке выполнения. Если вы поменяли порядок утверждений catch , вначале будет выполняться catch Exception .

Аналогично, если бы вы выбрали Exception UnexpectedValueException вы увидите второй обработчик стандартного Exception .

в конце концов

Если вам нужно что-то сделать после того, как try или catch закончена, вы можете использовать оператор finally :

try {
    throw new Exception('Hello world');
} catch (Exception $e) {
    echo 'Uh oh! ' . $e->getMessage();
} finally {
    echo " - I'm finished now - home time!";
}

В приведенном выше примере будет выводиться следующее:

О, о! Привет, мир. Я закончил сейчас - домашнее время!

Throwable

В PHP 7 мы видим введение интерфейса Throwable , который реализует Error а также Exception . Это добавляет уровень контракта на обслуживание между исключениями в PHP 7 и позволяет реализовать интерфейс для собственных пользовательских исключений:

$handler = function(\Throwable $ex) {
    $msg = "[ {$ex->getCode()} ] {$ex->getTraceAsString()}";
    mail('[email protected]', $ex->getMessage(), $msg);
    echo myNiceErrorMessageFunction();
};
set_exception_handler($handler);
set_error_handler($handler);

До PHP 7 вы можете просто набрать Exception поскольку с PHP 5 все классы исключений расширяют его.

Регистрация фатальных ошибок

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

function fatalErrorHandler() {
    // Let's get last error that was fatal.
    $error = error_get_last();
   
    // This is error-only handler for example purposes; no error means that
    // there were no error and shutdown was proper. Also ensure it will handle 
    // only fatal errors.
    if (null === $error || E_ERROR != $error['type']) {
        return;
    }

    // Log last error to a log file.
    // let's naively assume that logs are in the folder inside the app folder.
    $logFile = fopen("./app/logs/error.log", "a+");

    // Get useful info out of error.
    $type    = $error["type"];
    $file    = $error["file"];
    $line    = $error["line"];
    $message = $error["message"]

    fprintf(
        $logFile,
        "[%s] %s: %s in %s:%d\n",
        date("Y-m-d H:i:s"),
        $type,        
        $message,
        $file, 
        $line);

    fclose($logFile);       
}


register_shutdown_function('fatalErrorHandler');

Ссылка:



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow