PHP
Обработка исключений и отчетов об ошибках
Поиск…
Настройка отчетов об ошибках и их отображение
Если это еще не сделано в 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');
Ссылка:
- http://php.net/manual/en/function.register-shutdown-function.php
- http://php.net/manual/en/function.error-get-last.php
- http://php.net/manual/en/errorfunc.constants.php