tracerdx at tracerdx dot com ¶
17 years ago
I keep seeing qualification lists for error types/error-nums as arrays; In user notes and in the manual itself. For example, in this manual entry's example, when trying to seperate behavior for the variable trace in the error report:
<?php //...
// set of errors for which a var trace will be saved
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);//and later...if (in_array($errno, $user_errors)) {
//...whatever
}//... ?>
I was under the impression that PHP error code values where bitwise flag values. Wouldn't bitwise masking be better? So I propose a slightly better way:
<?php //...$user_errors = E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE;//...blah...if ($errno & $user_errors) {
//...whatever
}//... ?>
Or for those of you who don't like the idea of using an integer as the condition in an if statement:
<?php
if (($errno & $user_errors) > 0) {
//...whatever
}
?>
I think that's much more efficient than using _yet another_ array() constuct and an in_array().
If I am wrong, and the E_* constants aren't supposed to be used in this fashion (ie, the constans aren't guaranteed to be bitwise, which would be odd since that's how they're setup in the php.ini file), then delete me. I just don't see why one should be using arrays when bitwise comparisons will work, considering the bitwise method should be MUCH more efficient.
shawing at gmail dot com ¶
18 years ago
Although the root user writes to the files 'error_log' and 'access_log', the Apache user has to own the file referenced by 'error_log = filename' or no log entries will be written.
; From php.ini
; Log errors to specified file.
error_log = /usr/local/apache/logs/php.errors
[root@www logs]$ ls -l /usr/local/apache/logs/php.errors
-rw-r--r-- 1 nobody root 27K Jan 27 16:58 php.errors
ptah at se dot linux dot org ¶
18 years ago
PHP5 only (only tested with php5.0).
If you, for some reason, prefer exceptions over errors and have your custom error handler (set_error_handler) wrap the error into an exception you have to be careful with your script.
Because if you, instead of just calling the exception handler, throws the exception, and having a custom exception handler (set_exception_handler). And an error is being triggered inside that exception handler, you will get a weird error:
"Fatal error: Exception thrown without a stack frame in Unknown on line 0"
This error is not particulary informative, is it? :)
This example below will cause this error.
<?php
class PHPErrorException extends Exception
{
private $context = null;
public function __construct
($code, $message, $file, $line, $context = null)
{
parent::__construct($message, $code);
$this->file = $file;
$this->line = $line;
$this->context = $context;
}
};
function
error_handler($code, $message, $file, $line) {
throw new PHPErrorException($code, $message, $file, $line);
}
function
exception_handler(Exception $e)
{
$errors = array(
E_USER_ERROR => "User Error",
E_USER_WARNING => "User Warning",
E_USER_NOTICE => "User Notice",
);
echo
$errors[$e->getCode()].': '.$e->getMessage().' in '.$e->getFile().
' on line '.$e->getLine()."n";
echo $e->getTraceAsString();
}set_error_handler('error_handler');
set_exception_handler('exception_handler');// Throw exception with an /unkown/ error code.
throw new Exception('foo', 0);
?>
There are however, easy fix for this as it's only cause is sloppy code.
Like one, directly call exception_handler from error_handler instead of throwing an exception. Not only does it remedy this problem, but it's also faster. Though this will cause a `regular` unhandled exception being printed and if only "designed" error messages are intended, this is not the ultimate solution.
So, what is there to do? Make sure the code in exception_handlers doesn't cause any errors! In this case a simple isset() would have solved it.
regards, C-A B.
Stephen ¶
16 years ago
If you are using PHP as an Apache module, your default behavior may be to write PHP error messages to Apache's error log. This is because the error_log .ini directive may be set equal to "error_log" which is also the name of Apache's error log. I think this is intentional.
However, you can separate Apache errors from PHP errors if you wish by simply setting a different value for error_log. I write mine in the /var/log folder.
mortonda at dgrmm dot net ¶
16 years ago
Note the example code listed here calls date() every time this is called. If you have a complex source base which calls the custom error handler often, it can end up taking quite a bit of time. I ran a profiler on som code and discovered that 50% of the time was spent in the date function in this error handler.
Anonymous ¶
17 years ago
When configuring your error log file in php.ini, you can use an absolute path or a relative path. A relative path will be resolved based on the location of the generating script, and you'll get a log file in each directory you have scripts in. If you want all your error messages to go to the same file, use an absolute path to the file.
In some application development methodologies, there is the concept of an application root directory, indicated by "/" (even on Windows). However, PHP does not seem to have this concept, and using a "/" as the initial character in a log file path produces weird behavior on Windows.
If you are running on Windows and have set, in php.ini:
error_log = "/php_error.log"
You will get some, but not all, error messages. The file will appear at
c:php_error.log
and contain internally generated error messages, making it appear that error logging is working. However, log messages requested by error_log() do NOT appear here, or anywhere else, making it appear that the code containing them did not get processed.
Apparently on Windows the internally generated errors will interpret "/" as "C:" (or possibly a different drive if you have Windows installed elsewhere - I haven't tested this). However, the error_log process apparently can't find "/" - understandably enough - and the message is dropped silently.
theotek AT nowhere DOT org ¶
16 years ago
It is totally possible to use debug_backtrace() inside an error handling function. Here, take a look:
<?php
set_error_handler('errorHandler');
function
errorHandler( $errno, $errstr, $errfile, $errline, $errcontext)
{
echo 'Into '.__FUNCTION__.'() at line '.__LINE__.
"nn---ERRNO---n". print_r( $errno, true).
"nn---ERRSTR---n". print_r( $errstr, true).
"nn---ERRFILE---n". print_r( $errfile, true).
"nn---ERRLINE---n". print_r( $errline, true).
"nn---ERRCONTEXT---n".print_r( $errcontext, true).
"nnBacktrace of errorHandler()n".
print_r( debug_backtrace(), true);
}
function
a( )
{
//echo "a()'s backtracen".print_r( debug_backtrace(), true);
asdfasdf; // oops
}
function
b()
{
//echo "b()'s backtracen".print_r( debug_backtrace(), true);
a();
}b();
?>
Outputs:
<raw>
Into errorhandler() at line 9
---ERRNO---
8
---ERRSTR---
Use of undefined constant asdfasdf - assumed 'asdfasdf'
---ERRFILE---
/home/theotek/test-1.php
---ERRLINE---
23
---ERRCONTEXT---
Array
(
)
Backtrace of errorHandler()
Array
(
[0] => Array
(
[function] => errorhandler
[args] => Array
(
[0] => 8
[1] => Use of undefined constant asdfasdf - assumed 'asdfasdf'
[2] => /home/theotek/test-1.php
[3] => 23
[4] => Array
(
)
)
)
[1] => Array
(
[file] => /home/theotek/test-1.php
[line] => 23
[function] => a
)
[2] => Array
(
[file] => /home/theotek/test-1.php
[line] => 30
[function] => a
[args] => Array
(
)
)
[3] => Array
(
[file] => /home/theotek/test-1.php
[line] => 33
[function] => b
[args] => Array
(
)
)
)
</raw>
So, the first member of the backtrace's array is not really surprising, except from the missing "file" and "line" members.
The second member of the backtrace seem the be a hook inside the zend engine that is used to trigger the error.
Other members are the normal backtrace.
jbq at caraldi dot com ¶
15 years ago
Precision about error_log when configured with syslog: the syslog() call is done with severity NOTICE.
petrov dot michael () gmail com ¶
16 years ago
I have found that on servers that enforce display_errors to be off it is very inconvenient to debug syntax errors since they cause fatal startup errors. I have used the following method to bypass this limitation:
The syntax error is inside the file "syntax.php", therefore I create a file "syntax.debug.php" with the following code:
<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
include(
'syntax.php');
?>
The 5 line file is guaranteed to be free of errors, allowing PHP to execute the directives within it before including the file which previously caused fatal startup errors. Now those fatal startup errors become run time fatal errors.
Обработка ошибок – это процесс обнаружения ошибок, вызванных вашей программой, и последующего принятия соответствующих мер. Если вы правильно обработаете ошибки, это может привести ко многим непредвиденным последствиям.
В PHP очень просто обрабатывать ошибки.
Использование функции die ()
При написании PHP-программы вы должны проверить все возможные ошибки, прежде чем идти вперед, и при необходимости предпринять соответствующие действия.
Попробуйте следующий пример без файла /tmp/test.xt и с этим файлом.
<?php if(!file_exists("/tmp/test.txt")) { die("File not found"); }else { $file = fopen("/tmp/test.txt","r"); print "Opend file sucessfully"; } // Test of the code here. ?>
Таким образом, вы можете написать эффективный код. Используя описанную выше технику, вы можете остановить свою программу, когда она выдаст ошибку, и отобразить более значимое и удобное сообщение.
Определение пользовательской функции обработки ошибок
Вы можете написать свою собственную функцию для обработки любой ошибки. PHP предоставляет платформу для определения функции обработки ошибок.
Эта функция должна обрабатывать минимум два параметра (уровень ошибки и сообщение об ошибке), но может принимать до пяти параметров (опционально: файл, номер строки и контекст ошибки) –
Синтаксис
error_function(error_level,error_message, error_file,error_line,error_context);
Sr.No | Параметр и описание |
---|---|
1 |
error_level Обязательный. Указывает уровень отчета об ошибке для пользовательской ошибки. Должно быть значением числа. |
2 |
сообщение об ошибке Обязательно – указывает сообщение об ошибке для пользовательской ошибки |
3 |
error_file Необязательно: указывает имя файла, в котором произошла ошибка |
4 |
error_line Необязательно: указывает номер строки, в которой произошла ошибка |
5 |
error_context Необязательно: указывает массив, содержащий все переменные и их значения, используемые при возникновении ошибки |
error_level
Обязательный. Указывает уровень отчета об ошибке для пользовательской ошибки. Должно быть значением числа.
сообщение об ошибке
Обязательно – указывает сообщение об ошибке для пользовательской ошибки
error_file
Необязательно: указывает имя файла, в котором произошла ошибка
error_line
Необязательно: указывает номер строки, в которой произошла ошибка
error_context
Необязательно: указывает массив, содержащий все переменные и их значения, используемые при возникновении ошибки
Возможные уровни ошибок
Эти уровни отчетов об ошибках – это различные типы ошибок, для которых может использоваться пользовательский обработчик ошибок. Эти значения могут использоваться в комбинации с использованием | оператор
Sr.No | Константа и описание | Значение |
---|---|---|
1 |
.E_ERROR Фатальные ошибки времени выполнения. Выполнение скрипта остановлено |
1 |
2 |
E_WARNING Не фатальные ошибки времени выполнения. Выполнение скрипта не прекращается |
2 |
3 |
E_PARSE Ошибки синтаксического анализа во время компиляции. Ошибки разбора должны генерироваться только парсером. |
4 |
4 |
E_NOTICE Уведомления во время выполнения. Сценарий обнаружил что-то, что может быть ошибкой, но также может произойти при обычном запуске |
8 |
5 |
E_CORE_ERROR Неустранимые ошибки, возникающие при первоначальном запуске PHP. |
16 |
6 |
E_CORE_WARNING Не фатальные ошибки времени выполнения. Это происходит во время первоначального запуска PHP. |
32 |
7 |
E_USER_ERROR Фатальная ошибка, сгенерированная пользователем. Это похоже на E_ERROR, установленный программистом с помощью PHP-функции trigger_error () |
256 |
8 |
E_USER_WARNING Не фатальное предупреждение, генерируемое пользователем. Это похоже на E_WARNING, установленный программистом с помощью PHP-функции trigger_error () |
512 |
9 |
E_USER_NOTICE Пользовательское уведомление. Это похоже на E_NOTICE, установленный программистом с помощью PHP-функции trigger_error () |
1024 |
10 |
E_STRICT Уведомления во время выполнения. Включите, чтобы PHP предлагал изменения в вашем коде, которые обеспечат наилучшую совместимость и прямую совместимость вашего кода. |
2048 |
11 |
E_RECOVERABLE_ERROR Ловимая фатальная ошибка. Это похоже на E_ERROR, но может быть перехвачено пользовательским дескриптором (см. Также set_error_handler ()) |
4096 |
12 |
E_ALL Все ошибки и предупреждения, кроме уровня E_STRICT (E_STRICT будет частью E_ALL начиная с PHP 6.0) |
8191 |
.E_ERROR
Фатальные ошибки времени выполнения. Выполнение скрипта остановлено
E_WARNING
Не фатальные ошибки времени выполнения. Выполнение скрипта не прекращается
E_PARSE
Ошибки синтаксического анализа во время компиляции. Ошибки разбора должны генерироваться только парсером.
E_NOTICE
Уведомления во время выполнения. Сценарий обнаружил что-то, что может быть ошибкой, но также может произойти при обычном запуске
E_CORE_ERROR
Неустранимые ошибки, возникающие при первоначальном запуске PHP.
E_CORE_WARNING
Не фатальные ошибки времени выполнения. Это происходит во время первоначального запуска PHP.
E_USER_ERROR
Фатальная ошибка, сгенерированная пользователем. Это похоже на E_ERROR, установленный программистом с помощью PHP-функции trigger_error ()
E_USER_WARNING
Не фатальное предупреждение, генерируемое пользователем. Это похоже на E_WARNING, установленный программистом с помощью PHP-функции trigger_error ()
E_USER_NOTICE
Пользовательское уведомление. Это похоже на E_NOTICE, установленный программистом с помощью PHP-функции trigger_error ()
E_STRICT
Уведомления во время выполнения. Включите, чтобы PHP предлагал изменения в вашем коде, которые обеспечат наилучшую совместимость и прямую совместимость вашего кода.
E_RECOVERABLE_ERROR
Ловимая фатальная ошибка. Это похоже на E_ERROR, но может быть перехвачено пользовательским дескриптором (см. Также set_error_handler ())
E_ALL
Все ошибки и предупреждения, кроме уровня E_STRICT (E_STRICT будет частью E_ALL начиная с PHP 6.0)
Все вышеперечисленные уровни ошибок могут быть установлены с помощью следующей функции встроенной библиотеки PHP, где уровень cab может быть любым из значений, определенных в приведенной выше таблице.
int error_reporting ( [int $level] )
Ниже описан способ создания одной функции обработки ошибок:
<?php function handleError($errno, $errstr,$error_file,$error_line) { echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line"; echo "<br />"; echo "Terminating PHP Script"; die(); } ?>
После того, как вы определили свой собственный обработчик ошибок, вам нужно установить его с помощью встроенной в PHP функции библиотеки set_error_handler . Теперь давайте рассмотрим наш пример, вызвав функцию, которая не существует.
<?php error_reporting( E_ERROR ); function handleError($errno, $errstr,$error_file,$error_line) { echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line"; echo "<br />"; echo "Terminating PHP Script"; die(); } //set error handler set_error_handler("handleError"); //trigger error myFunction(); ?>
Обработка исключений
PHP 5 имеет модель исключений, аналогичную модели других языков программирования. Исключения важны и обеспечивают лучший контроль над обработкой ошибок.
Поясним там новое ключевое слово, связанное с исключениями.
-
Try – функция, использующая исключение, должна находиться в блоке try. Если исключение не сработает, код продолжит работу как обычно. Однако если срабатывает исключение, исключение «выбрасывается».
-
Бросок – это то, как вы вызываете исключение. Каждый «бросок» должен иметь как минимум один «улов».
-
Catch – блок «catch» извлекает исключение и создает объект, содержащий информацию об исключении.
Try – функция, использующая исключение, должна находиться в блоке try. Если исключение не сработает, код продолжит работу как обычно. Однако если срабатывает исключение, исключение «выбрасывается».
Бросок – это то, как вы вызываете исключение. Каждый «бросок» должен иметь как минимум один «улов».
Catch – блок «catch» извлекает исключение и создает объект, содержащий информацию об исключении.
Когда генерируется исключение, код, следующий за оператором, не будет выполнен, и PHP попытается найти первый соответствующий блок catch. Если исключение не перехвачено, в PHP Fatal Error будет выдано «Uncaught Exception …
-
Исключение может быть сгенерировано и «поймано» в PHP. Код может быть заключен в блок try.
-
Каждая попытка должна иметь хотя бы один соответствующий блок catch. Несколько блоков catch могут использоваться для перехвата различных классов исключений.
-
Исключения могут быть выброшены (или переброшены) в блоке catch.
Исключение может быть сгенерировано и «поймано» в PHP. Код может быть заключен в блок try.
Каждая попытка должна иметь хотя бы один соответствующий блок catch. Несколько блоков catch могут использоваться для перехвата различных классов исключений.
Исключения могут быть выброшены (или переброшены) в блоке catch.
пример
Ниже приведен фрагмент кода, скопируйте и вставьте этот код в файл и проверьте результат.
<?php try { $error = 'Always throw this error'; throw new Exception($error); // Code following an exception is not executed. echo 'Never executed'; }catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "n"; } // Continue execution echo 'Hello World'; ?>
В приведенном выше примере функция $ e-> getMessage используется для получения сообщения об ошибке. Существуют следующие функции, которые можно использовать из класса Exception .
-
getMessage () – сообщение об исключении
-
getCode () – код исключения
-
getFile () – имя файла источника
-
getLine () – исходная строка
-
getTrace () – n массив обратной трассировки ()
-
getTraceAsString () – форматированная строка трассировки
getMessage () – сообщение об исключении
getCode () – код исключения
getFile () – имя файла источника
getLine () – исходная строка
getTrace () – n массив обратной трассировки ()
getTraceAsString () – форматированная строка трассировки
Создание пользовательского обработчика исключений
Вы можете определить свой собственный обработчик исключений. Используйте следующую функцию, чтобы установить пользовательскую функцию обработчика исключений.
string set_exception_handler ( callback $exception_handler )
Здесь exception_handler – это имя функции, которая вызывается при возникновении неперехваченного исключения. Эта функция должна быть определена до вызова set_exception_handler ().
пример
<?php function exception_handler($exception) { echo "Uncaught exception: " , $exception->getMessage(), "n"; } set_exception_handler('exception_handler'); throw new Exception('Uncaught Exception'); echo "Not Executedn"; ?>
Проверьте полный набор функций обработки ошибок в PHP Функции обработки ошибок
PHP5 Обработка ошибок
Обработка ошибок по умолчанию в PHP очень проста. Сообщение об ошибке с именем файла, строка число и сообщение, описывающее ошибку, отправляется в браузер.
При создании скриптов и веб-приложений, обработка ошибок, является важной
частью. Если коду не хватает кода проверки ошибок, программа может выглядеть
непрофессионально и Вы можете быть открыты для рисков безопасности.
Учебник содержит несколько из наиболее распространенных методов проверки ошибок в PHP.
Вы узнаете различные методы обработки ошибок:
- Простое заявление
это()
- Пользовательские ошибки и триггеры ошибок
- Отчеты об ошибках
PHP Основная обработка ошибок
В первом примере показан простой скрипт, открывающий текстовый файл: использование функции это()
Пример
<?php
$file=fopen(«welcome.txt»,»r»);
?>
Если файл не существует, Вы можете получить ошибку, как эта:
Внимание: fopen(welcome.txt) [function.fopen]: не удалось открыть поток:
Нет такого файла или каталога в C:webfoldertest.php на линии 2
Чтобы запретить пользователю получать сообщение об ошибке, подобное приведенному примеру выше, мы проверяем
файл, существует ли он до того, как мы попытаемся получить к нему доступ:
Пример
<?php
if(!file_exists(«welcome.txt»)) {
die(«Файл не найден»);
}
else {
$file=fopen(«welcome.txt»,»r»);
}
?>
Теперь, если файл не существует вы получите ошибку, как эта:
Файл не найден
Приведенный ниже код более эффективен, чем предыдущий код, поскольку он использует простой механизм обработки ошибок для остановки сценария после ошибки.
Тем не менее, остановить просто сценарий не всегда правильный путь. Рассмотрим альтернативные функции PHP для обработки ошибок.
PHP Создание пользовательского обработчика ошибок
Создать пользовательский обработчик ошибок довольно просто. Создаем специальную функцию, которая может быть вызвана при возникновении ошибки в PHP.
Эта функция должна быть способна обрабатывать, как минимум два параметра (уровень ошибки и сообщение об ошибке),
но можно принимать до пяти параметров (дополнительно: файл, номер строки и контекст ошибки):
Синтаксис
error_function(error_level,error_message,
error_file,error_line,error_context)
Параметр | Описание |
---|---|
error_level | Необходимо. Указывает уровень отчета об ошибках для пользовательской ошибки. Должно быть числовое значение. См. таблицу ниже для возможных уровней отчета об ошибках |
error_message | Необходимо. Указывает сообщение об ошибке определяемая пользователем |
error_file | Необязательно. Задает имя файла, в котором произошла ошибка |
error_line | Необязательно. Указывает номер строки, в которой произошла ошибка |
error_context | Необязательно. Задает массив, содержащий все переменные и их значения, используемые при возникновении ошибки |
PHP Уровни отчетов об ошибках
Эти уровни отчетов об ошибках, являются различными типами ошибок, для которых может использоваться определяемый пользователем обработчик ошибок:
Значение | Констант | Описание |
---|---|---|
2 | E_WARNING | Неустранимые ошибки выполнения. Выполнение скрипта не останавливается |
8 | E_NOTICE | Уведомления среды выполнения. Сценарий нашел что-то, что могло бы быть ошибкой, но могло бы также произойти при запуске сценария, как обычно |
256 | E_USER_ERROR | Неустранимая ошибка пользователя. Это похоже на набор E_ERROR установленный программистом с помощью функции PHP trigger_error() |
512 | E_USER_WARNING | Неустранимое пользовательское предупреждение. Это похоже на набор E_WARNING установленный программистом с помощью функции PHP trigger_error() |
1024 | E_USER_NOTICE | Автоматическое уведомление пользователя. Это похоже на набор E_NOTICE устанавливается программистом с помощью функции PHP trigger_error() |
4096 | E_RECOVERABLE_ERROR | Перехватываемая неустранимая ошибка. Это похоже на набор E_ERROR но может быть перехватана пользователем, определенной обработкой (смотреть также set_error_handler()) |
8191 | E_ALL | Все ошибки и предупреждение (E_STRICT становится частью E_ALL в PHP 5.4) |
Теперь давайте создадим функцию для обработки ошибок:
Пример
function customError($errno, $errstr) {
echo «<b>Ошибка:</b> [$errno] $errstr<br>»;
echo «Конечный Script»;
die();
}
Приведенный выше код, является простой функцией обработки ошибок. Когда он срабатывает, он получает код ошибки и сообщение об ошибке.
Затем выводится уровень ошибки и сообщение и завершается сценарий.
Теперь, когда Вы создали функцию обработки ошибок, Вы должны решить, когда она должно сработать.
PHP Установить обработчик ошибок
Обработчик ошибок по умолчанию для PHP является встроенным обработчиком ошибок.
Мы собираемся сделать функцию над обработчиком ошибок по умолчанию на время скрипта.
Можно изменить обработчик ошибок для применения только к некоторым ошибкам, таким образом,
сценарий может обрабатывать различные ошибки по-разному.
Однако, в этом примере мы будем использовать наш пользовательский обработчик ошибок для всех ошибок:
set_error_handler(«customError»);
Поскольку мы хотим, чтобы наша пользовательская функция обрабатывала все ошибки, set_error_handler()
требуется только один параметр, второй параметр может быть добавлен, чтобы указать уровень ошибки.
Тестирование обработчика ошибок при попытке вывести несуществующую переменную:
Пример
<?php
//функция обработчика ошибок
function customError($errno, $errstr) {
echo «<b>Ошибка:</b> [$errno] $errstr»;
}
//установить обработчик ошибок
set_error_handler(«customError»);
//Вызов ошибки
echo($test);
?>
Выходные данные приведенного выше кода должны быть примерно такими:
Ошибка: [8] Неопределенна переменная: test
PHP Вызвать ошибку
В скрипте, где пользователи могут вводить данные, полезно инициировать ошибки, когда происходит незаконный ввод.
В PHP это делается с помощью функции trigger_error()
.
В этом примере возникает ошибка, если $test
переменная больше, чем 1
:
Пример
<?php
$test=2;
if ($test>=1)
{
trigger_error(«Значение должно быть 1 или ниже»);
}
?>
Выходные данные приведенного выше кода должны быть примерно такими:
Заметьте: Значение должно быть 1 или ниже
в C:webfoldertest.php на линии 6
Ошибка может быть вызвана в любом месте сценария и путем добавления
второй параметр, Вы можете указать, какой уровень ошибки срабатывает.
Возможные типы ошибок:
- E_USER_ERROR — Неустранимая пользовательская ошибка выполнения. Ошибки, из которых невозможно восстановить. Выполнение скрипта прекращается
- E_USER_WARNING — Непоправимое пользовательское предупреждение во время выполнения. Выполнение скрипта не останавливается
- E_USER_NOTICE — Невыполнение. Уведомление о времени выполнения, созданное пользователем. Сценарий нашел что-то, что могло бы быть ошибкой, но могло бы также произойти при запуске сценария
В этом примере E_USER_WARNING происходит, если переменная $test
больше, чем 1
. Если происходит E_USER_WARNING мы будем использовать наш пользовательский обработчик ошибок и закончить сценарий:
Пример
<?php
//функция обработчика ошибок
function customError($errno, $errstr) {
echo «<b>Ошибка:</b> [$errno] $errstr<br>»;
echo «Закончить Script»;
die();
}
//установить обработчик ошибок
set_error_handler(«customError»,E_USER_WARNING);
//вызов ошибки
$test=2;
if ($test>=1) {
trigger_error(«Значение должно быть 1 или ниже»,E_USER_WARNING);
}
?>
Выходные данные приведенного выше кода должны быть примерно такими:
Ошибка: [512] Значение должно быть 1 или ниже
Конец скрипта
Теперь, когда мы научились создавать собственные ошибки и как их вызвать,
давайте посмотрим на ошибки.
PHP Регистрация ошибок
По умолчанию, PHP отправляет отчет об ошибке в систему регистрации на сервер или файл,
в зависимости от того, как конфигурация error_log установлена в php.ini-файл. По
с помощью функции error_log()
можно отправлять журнал ошибок в указанный файл или в удаленное место назначения.
Отправка сообщений об ошибках по электронной почте, может быть хорошим способом получения уведомления о конкретных ошибках.
PHP Отправка сообщение об ошибке по электронной почте
В приведенном ниже примере мы отправим электронное письмо с сообщением об ошибке и
сценарий, если возникает ошибка:
Пример
<?php
//функция обработчика ошибок
function customError($errno, $errstr) {
echo «<b>Ошибка:</b> [$errno] $errstr<br>»;
echo «Веб-мастер был уведомлен»;
error_log(«Ошибка: [$errno] $errstr»,1,
«someone@example.com»,»От: webmaster@example.com»);
}
//установить обработчик ошибок
set_error_handler(«customError»,E_USER_WARNING);
//вызов ошибки
$test=2;
if ($test>=1) {
trigger_error(«Значение должно быть 1 или ниже»,E_USER_WARNING);
}
?>
Выходные данные приведенного выше кода должны быть примерно такими:
Ошибка: [512] Значение должно быть 1 или ниже
Веб-мастер был уведомлен
И почта, полученная из кода выше, выглядит так:
Ошибка: [512] начение должно быть 1 или ниже
Не должно использоваться со всеми ошибками. Регулярные ошибки должны быть зарегистрированы на
сервере, использующий систему регистрации PHP по умолчанию.
Prerequisite: Types of Error
PHP is used for web development. Error handling in PHP is almost similar to error handling in all programming languages. The default error handling in PHP will give file name line number and error type.
Ways to handle PHP Errors:
- Using die() method
- Custom Error Handling
Basic error handling: Using die() function The die() function print a message and exit from current script.
Syntax:
die( $message )
Example:
php
<?php
$file
=
fopen
(
"geeks.txt"
,
"w"
);
?>
Note: Run the above code and geeks.txt file is not present then it will display an run-time error message.
Runtime Error:
PHP Warning: fopen(geeks.txt): failed to open stream: Permission denied in /home/dac923dff0a2558b37ba742613273073.php on line 2
To prevent this error use die() function. Below is the implementation of die() function:
Example:
php
<?php
if
( !
file_exists
(
"geeks.txt"
) ) {
die
(
"File is not present"
);
}
else
{
$file
=
fopen
(
"geeks.txt"
,
"w"
);
}
?>
Note: If geeks.txt file not present then it will display output.
Output
File is not present
Custom Error handling: Creating a custom error handler in PHP is quite simple. Create a function that can be called when a error has been occurred in PHP.
Syntax:
error_function( $error_level, $error_message, $error_file, $error_line, $error_context)
Parameters: This function accepts five parameters as mentioned above and described below:
- $error_level: It is required parameter and it must be an integer. There are predefined error levels.
- $error_message: It is required parameter and it is the message which user want to print.
- $error_file: It is optional parameter and used to specify the file in which error has been occurred.
- $error_line: It is optional parameter and used to specify the line number in which error has been occurred.
- $error_context: It is optional parameter and used to specify an array containing every variable and their value when error has been occurred.
error_level: These are the possible error level which are listed below:
- 1 : .E_ERROR :fatal runtime error execution of script has been halted
- 2 : E_WARNING :non fatal runtime error execution of script has been halted
- 4 : E_PARSE :compile time error it is generated by the parser
- 8 :E_NOTICE :The script found something that might be an error
- 16 :E_CORE_ERROR :Fatal errors that occurred during initial startup of script
- 32 :E_CORE_WARNING :Non fatal errors that occurred during initial startup of script
- 8191 :E_ALL :All errors and warning
set_error_handler() Function: After creating myerror() function need to set custom error handler because in normal way PHP handles it but if user doing custom error handling then user have to set it in place of argument and pass out myerror function as a string.
Example:
php
<?php
function
myerror(
$error_no
,
$error_msg
) {
echo
"Error: [$error_no] $error_msg "
;
echo
"n Now Script will end"
;
die
();
}
set_error_handler(
"myerror"
);
$a
= 10;
$b
= 0;
echo
(
$a
/
$b
);;
?>
Output:
Error: [2] Division by zero Now Script will end
Conclusion: It is always try to error handling using Custom error handling because it will show more specified message according to the user that can be helpful to the user. If error is not handle using Custom error handling then a error occurred then out script will be halted by default but if it handle error using Custom error handling then it can continue script after displaying error message.
Обработка ошибок по умолчанию в PHP очень просто. Сообщение об ошибке с именем файла, номер строки и сообщение с описанием ошибки отправляется в браузер.
PHP Обработка ошибок
При создании сценариев и веб-приложений, обработка ошибок является важной частью. Если код отсутствует код ошибки проверки, ваша программа может выглядеть очень непрофессионально, и вы можете быть открытыми для угроз безопасности.
Это руководство содержит некоторые из наиболее распространенных ошибок методов в PHP проверки.
Мы покажем различные методы обработки ошибок:
- Простой » die() « заявление
- Пользовательские ошибки и триггеры ошибок
- Отчет об ошибках
Основная обработка ошибок: Использование die() функция
Первый пример показывает простой скрипт, который открывает текстовый файл:
<?php
$file=fopen(«welcome.txt»,»r»);
?>
Если файл не существует, вы можете получить сообщение об ошибке, подобное следующему:
Warning : fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:webfoldertest.php on line 2
Чтобы запретить пользователю получать сообщение об ошибке, как показано выше, мы проверяем, существует ли файл, прежде чем мы пытаемся получить к нему доступ:
<?php
if(!file_exists(«welcome.txt»)) {
die(«File not found»);
}
else {
$file=fopen(«welcome.txt»,»r»);
}
?>
Теперь, если файл не существует, вы получите сообщение об ошибке, как это:
Код выше является более эффективным, чем ранее кода, так как он использует простой механизм обработки ошибок, чтобы остановить скрипт после ошибки.
Однако, просто остановить скрипт не всегда правильный путь. Давайте посмотрим на альтернативные функции PHP для обработки ошибок.
Создание пользовательского обработчика ошибок
Создание обработчика ошибок довольно просто. Мы просто создаем специальную функцию, которая может быть вызвана, когда возникает ошибка в PHP.
Эта функция должна быть в состоянии обрабатывать как минимум два параметров (уровень ошибок и сообщение об ошибке) , но может принимать до пяти параметров (optionally: file, line-number, and the error context) :
Синтаксис
error_function(error_level,error_message,
error_file,error_line,error_context)
параметр | Описание |
---|---|
error_level | Необходимые. Определяет уровень отчета об ошибках для определенного пользователя ошибки. Должно быть числовое значение. Смотрите таблицу ниже для возможных уровней отчета об ошибке |
error_message | Необходимые. Определяет сообщение об ошибке для определенного пользователя ошибки |
error_file | Необязательный. Задает имя файла, в котором произошла ошибка |
error_line | Необязательный. Задает номер строки, в которой произошла ошибка |
error_context | Необязательный. Определяет массив, содержащий каждую переменную, и их значения, используется, когда произошла ошибка |
Ошибка уровней отчетов
Эти уровни отчета об ошибке различных типов ошибок определенного пользователя обработчик ошибок может быть использован для:
Стоимость | постоянная | Описание |
---|---|---|
2 | E_WARNING | Нефатальные ошибки во время выполнения. Выполнение скрипта не остановлено |
8 | E_NOTICE | Время выполнения уведомление. Сценарий нашел что-то, что может быть ошибкой, но может также произойти при выполнении сценария нормально |
256 | E_USER_ERROR | Фатальные пользователи ошибка. Это как E_ERROR установленный программистом с помощью функции PHP trigger_error() |
512 | E_USER_WARNING | Некритические пользователи предупреждение. Это как E_WARNING установленный программистом с помощью функции PHP trigger_error() |
1024 | E_USER_NOTICE | Пользователь сгенерированные уведомления. Это как E_NOTICE установленный программистом с помощью функции PHP trigger_error() |
4096 | E_RECOVERABLE_ERROR | Catchable фатальная ошибка. Это как E_ERROR , но может быть перехвачено определенным пользователем ручки (see also set_error_handler() ) |
8191 | E_ALL | Все ошибки и предупреждения (E_STRICT became a part of E_ALL in PHP 5.4) |
Теперь давайте создадим функцию для обработки ошибок:
function customError($errno, $errstr) {
echo «<b>Error:</b> [$errno] $errstr<br>»;
echo «Ending Script»;
die();
}
Код выше простая функция обработки ошибок. При срабатывании, он получает уровень ошибки и сообщение об ошибке. Затем он выводит уровень ошибки и сообщение и завершает сценарий.
Теперь, когда мы создали функцию обработки ошибок, мы должны решить, когда он должен быть запущен.
Установить обработчик ошибок
Обработчик ошибок по умолчанию для PHP является встроенным в обработчик ошибок. Мы собираемся сделать функцию выше обработчика ошибок по умолчанию для длительности сценария.
Можно изменить обработчик ошибок для применения только для некоторых ошибок, таким образом скрипт может обрабатывать различные ошибки по-разному. Однако, в этом примере мы будем использовать наш обработчик ошибок для всех ошибок:
set_error_handler(«customError»);
Так как мы хотим , чтобы наша пользовательская функция , чтобы обработать все ошибки, то set_error_handler() нужен только один параметр, второй параметр может быть добавлен , чтобы указать уровень ошибки.
пример
Тестирование обработчика ошибок, пытаясь выходным переменным, которая не существует:
<?php
//error handler function
function customError($errno, $errstr) {
echo «<b>Error:</b> [$errno] $errstr»;
}
//set error handler
set_error_handler(«customError»);
//trigger error
echo($test);
?>
Выход выше код должен быть что-то вроде этого:
Error: [8] Undefined variable: test
Trigger ошибки
В сценарии, где пользователи могут вводить данные полезно вызвать ошибки при возникновении недопустимого ввода. В PHP это делается с помощью trigger_error() функции.
пример
В этом примере ошибка возникает , если «test» переменная больше , чем «1» :
<?php
$test=2;
if ($test>=1)
{
trigger_error(«Value must be 1 or below»);
}
?>
Выход выше код должен быть что-то вроде этого:
Notice : Value must be 1 or below
in C:webfoldertest.php on line 6
Ошибка может быть вызвана в любом месте вы хотите в сценарии, и путем добавления второго параметра вы можете указать, что срабатывает уровень ошибки.
Возможные типы ошибок:
- E_USER_ERROR — Fatal пользователей ошибка времени выполнения. Ошибки, которые не могут быть восстановлены из. Выполнение скрипта останавливается
- E_USER_WARNING — Некритические пользователи предупреждения во время выполнения. Выполнение скрипта не остановлено
- E_USER_NOTICE — по умолчанию. Пользователь генерируемого во время выполнения уведомления. Сценарий нашел что-то, что может быть ошибкой, но может также произойти при выполнении сценария нормально
пример
В этом примере E_USER_WARNING происходит , если «test» переменная больше , чем «1» . При возникновении E_USER_WARNING мы будем использовать наш обработчик ошибок и закончить сценарий:
<?php
//error handler function
function customError($errno, $errstr) {
echo «<b>Error:</b> [$errno] $errstr<br>»;
echo «Ending Script»;
die();
}
//set error handler
set_error_handler(«customError»,E_USER_WARNING);
//trigger error
$test=2;
if ($test>=1) {
trigger_error(«Value must be 1 or below»,E_USER_WARNING);
}
?>
Выход выше код должен быть что-то вроде этого:
Error: [512] Value must be 1 or below
Ending Script
Теперь, когда мы научились создавать свои собственные ошибки и как вызвать их, давайте посмотрим на ведение журнала ошибок.
Ведение журнала ошибок
По умолчанию, PHP отправляет журнал ошибок в системе регистрации сервера или файла, в зависимости от того, как конфигурация error_log установлен в файле php.ini. При использовании error_log() функции вы можете отправить журналы ошибок в указанный файл или удаленный пункт назначения.
Отправка сообщения об ошибках в себя по электронной почте может быть хорошим способом получать уведомления о конкретных ошибках.
Отправить сообщение об ошибке по E-Mail
В примере ниже мы будем посылать электронную почту с сообщением об ошибке и завершить сценарий, если возникает специфическая ошибка:
<?php
//error handler function
function customError($errno, $errstr) {
echo «<b>Error:</b> [$errno] $errstr<br>»;
echo «Webmaster has been notified»;
error_log(«Error: [$errno] $errstr»,1,
«[email protected]»,»From: [email protected]»);
}
//set error handler
set_error_handler(«customError»,E_USER_WARNING);
//trigger error
$test=2;
if ($test>=1) {
trigger_error(«Value must be 1 or below»,E_USER_WARNING);
}
?>
Выход выше код должен быть что-то вроде этого:
Error: [512] Value must be 1 or below
Webmaster has been notified
И почта, полученная из приведенной выше коды выглядит следующим образом:
Error: [512] Value must be 1 or below
Это не должно использоваться со всеми ошибками. Обычные ошибки должны быть авторизованы на сервере, используя систему по умолчанию протоколирования PHP.
If you use a custom error handler in PHP, you can see the context of an error (the value of all variables at the place where it occurred). Is there any way to do this for exceptions? I mean getting the context, not setting an exception handler.
asked Nov 27, 2009 at 15:39
Bart van HeukelomBart van Heukelom
42.8k59 gold badges184 silver badges298 bronze badges
You can attach the context to your exception manually. I have never tried it, but it would be interesting to create a custom exception that in the constructor calls and saves get_defined_vars()
for later retrieval.
This will be a heavy exception
proof of concept:
class MyException extends Exception() {
protected $throwState;
function __construct() {
$this->throwState = get_defined_vars();
parent::__construct();
}
function getState() {
return $this->throwState;
}
}
even better:
class MyException extends Exception implements IStatefullException() {
protected $throwState;
function __construct() {
$this->throwState = get_defined_vars();
parent::__construct();
}
function getState() {
return $this->throwState;
}
function setState($state) {
$this->throwState = $state;
return $this;
}
}
interface IStatefullException { function getState();
function setState(array $state); }
$exception = new MyException();
throw $exception->setState(get_defined_vars());
answered Nov 27, 2009 at 15:59
Exception eException e
1,8543 gold badges19 silver badges32 bronze badges
3
Couldn’t you also do:
class ContextException extends Exception {
public $context;
public function __construct($message = null, $code = 0, Exception $previous = null, $context=null) {
parent::__construct($message, $code, $previous);
$this->context = $context;
}
public function getContext() {
return $this->context;
}
}
That would avoid the need to instantiate the exception and then throw it.
answered Feb 8, 2010 at 17:36
AndrewAndrew
511 silver badge1 bronze badge
Exceptions in PHP:
http://www.php.net/manual/en/language.exceptions.extending.php
Methods of the basic Exception class:
final public function getMessage(); // message of exception
final public function getCode(); // code of exception
final public function getFile(); // source filename
final public function getLine(); // source line
final public function getTrace(); // an array of the backtrace()
final public function getPrevious(); // previous exception
final public function getTraceAsString(); // formatted string of trace
So, this is what you have to work with if you caught a basic exception. If you don’t have control over the code that generates the exception then there’s not much to be done about getting any more context as the context in which it was thrown is gone by the time you catch it. If you are generating the exception yourself then you can attach the context to the exception before it’s thrown.
answered Nov 27, 2009 at 16:02
Nate C-KNate C-K
5,6742 gold badges27 silver badges45 bronze badges
Обработка ошибок и исключений
Обработка ошибок — это процесс обнаружения ошибок, вызванных вашей программой, а затем принятия соответствующих мер.
Если вы будете правильно обрабатывать ошибки, это может привести ко многим непредвиденным последствиям.
Использование функции die ()
При написании вашей программы PHP вы должны проверить все возможные условия ошибки перед тем, как идти вперед, и при необходимости предпринять соответствующие действия.
Попробуйте привести пример без файла /tmp/test.xt и с этим файлом.
<?php
if(!file_exists("/tmp/test.txt")) {
die("File not found");
}else {
$file = fopen("/tmp/test.txt","r");
print "Opend file sucessfully";
}
// Test of the code here.
?>
Таким образом, вы можете написать эффективный код. Используя вышеприведенную технику,
вы можете остановить свою программу всякий раз, когда она выдает ошибки и отображает более содержательные и удобные для пользователя сообщения.
Определение пользовательской функции обработки ошибок
Вы можете написать свою собственную функцию для обработки любой ошибки.
PHP предоставляет вам структуру для определения функции обработки ошибок.
Эта функция должна иметь возможность обрабатывать минимум два параметра (уровень ошибки и сообщение об ошибке), но может принимать до пяти параметров (опционально: файл, номер строки и контекст ошибки) —
Синтаксис
error_function(error_level,error_message, error_file,error_line,error_context);
-
error_level
Обязательный параметр — задает уровень отчета об ошибке для пользовательской ошибки. Значение должно быть числом.
-
error_message
Обязательный параметр — указывает сообщение об ошибке для пользовательской ошибки
-
error_file
Необязательно. Указывает имя файла, в котором произошла ошибка.
-
error_line
Необязательно. Указывает номер строки, в которой произошла ошибка.
-
error_context
Необязательно. Указывает массив, содержащий каждую переменную, и их значения, используемые при возникновении ошибки.
Возможные уровни ошибок
Эти уровни отчетов об ошибках представляют собой различные типы ошибок, к которым может использоваться пользовательский обработчик ошибок.
Эти значения используются в комбинации с использованием | оператор
-
.E_ERROR
Неустранимая ошибки во время выполнения. Выполнение сценария останавливается
-
E_WARNING
Нефатальные ошибки во время выполнения. Выполнение скрипта не останавливается
-
E_PARSE
Ошибки анализа времени компиляции. Ошибки анализа должны генерироваться только парсером.
-
E_NOTICE
Уведомления о времени выполнения. Скрипт нашел что-то, что может быть ошибкой, но может также произойти при обычном сценарии
-
E_CORE_ERROR
Неустранимая ошибки, возникающие во время первоначального запуска PHP.
-
E_CORE_WARNING
Нефатальные ошибки во время выполнения. Это происходит во время первоначального запуска PHP.
-
E_USER_ERROR
Неустранимая пользовательская ошибка. Это похоже на набор E_ERROR программиста, использующий функцию PHP trigger_error ()
-
E_USER_WARNING
Нефатальное пользовательское предупреждение. Это похоже на E_WARNING, установленный программистом с использованием функции PHP trigger_error ()
-
E_USER_NOTICE
Пользовательское уведомление. Это похоже на набор E_NOTICE, заданный программистом с использованием функции PHP trigger_error ()
-
E_STRICT
Уведомления о времени выполнения. Включите, чтобы PHP предлагал изменения в вашем коде, что обеспечит лучшую совместимость и передовую совместимость вашего кода.
-
E_RECOVERABLE_ERROR
Ловкая ошибка. Это похоже на E_ERROR, но может быть захвачен определяемым пользователем дескриптором (см. Также set_error_handler ())
-
E_ALL
Все ошибки и предупреждения, кроме уровня E_STRICT (E_STRICT будет частью E_ALL с PHP 6.0)
Все указанные выше уровни ошибок можно задать, используя встроенную библиотечную функцию PHP, где уровень кабина будет любым значением, определенным в таблице выше.
int error_reporting ( [int $level] )
Ниже приведен способ создания одной функции обработки ошибок —
<?php
function handleError($errno, $errstr,$error_file,$error_line) {
echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line";
echo "<br />";
echo "Terminating PHP Script";
die();
}
?>
После того, как вы определили свой собственный обработчик ошибок, вам нужно установить его с помощью встроенной библиотеки set_error_handler.
Теперь рассмотрим наш пример, вызывая функцию, которая не существует.
<?php
error_reporting( E_ERROR );
function handleError($errno, $errstr,$error_file,$error_line) {
echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line";
echo "<br />";
echo "Terminating PHP Script";
die();
}
//set error handler
set_error_handler("handleError");
//trigger error
myFunction();
?>
Обработка исключений
PHP 5 имеет модель исключения, аналогичную модели других языков программирования. Исключения важны и обеспечивают лучший контроль над обработкой ошибок.
Давайте объясним новое ключевое слово, связанное с исключениями.
-
try-функция, использующая исключение, должна быть в блоке «try». Если исключение не запускается, код будет продолжен как обычно. Однако, если исключение инициируется, исключение «бросается».
-
Throw — это то, как вы вызываете исключение. Каждый «бросок» должен иметь хотя бы один «улов».
-
Catch — блок «catch» извлекает исключение и создает объект, содержащий информацию об исключении
Когда генерируется исключение, код, следующий за оператором, не будет выполнен, а PHP попытается найти первый соответствующий блок catch. Если исключение не поймано, PHP Fatal Error будет выпущена с помощью «Uncaught Exception …
-
Исключение можно выбросить и поймать («поймать») в PHP. Код может быть окружен в блоке try.
-
Каждая попытка должна иметь по крайней мере один соответствующий блок catch. Для блокировки различных классов исключений можно использовать несколько блоков catch.
-
Исключения могут быть сброшены (или повторно выбраны) в блоке catch.
Пример
<?php
try {
$error = 'Always throw this error';
throw new Exception($error);
// Code following an exception is not executed.
echo 'Never executed';
}catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "n";
}
// Continue execution
echo 'Hello World';
?>
В приведенном выше примере функция $ e-> getMessage используется для получения сообщения об ошибке.
Существуют следующие функции, которые могут использоваться из класса Exception.
-
getMessage ()— сообщение об исключении
-
getCode () — код исключения
-
getFile () — исходное имя файла
-
getLine () — исходная строка
-
getTrace () — n массив backtrace ()
-
getTraceAsString () — сформированная строка трассировки
Создание настраиваемого обработчика исключений
Вы можете определить собственный собственный обработчик исключений.
Используйте следующую функцию для установки пользовательской функции обработчика исключений.
string set_exception_handler ( callback $exception_handler )
Здесь exception_handler — это имя вызываемой функции, когда происходит неперехваченное исключение.
Эта функция должна быть определена перед вызовом set_exception_handler ().
Пример
<?php
function exception_handler($exception) {
echo "Uncaught exception: " , $exception->getMessage(), "n";
}
set_exception_handler('exception_handler');
throw new Exception('Uncaught Exception');
echo "Not Executedn";
?>
Обработка ошибок — это процесс обнаружения ошибок, вызванных вашей программой, а затем принятия соответствующих мер. Если вы будете правильно обрабатывать ошибки, это может привести ко многим непредвиденным последствиям.
Содержание:
- Использование функции die()
- Определение пользовательской функции обработки ошибок
- Возможные уровни ошибок
- Обработка исключений
- Создание настраиваемого обработчика исключений
Это очень просто в PHP для обработки ошибок.
Использование функции die()
При написании вашей программы PHP вы должны проверить все возможные условия ошибки перед тем, как идти вперед, и при необходимости предпринять соответствующие действия.
Попробуйте привести пример без файла / tmp / test.xt и с этим файлом.
<?php if(!file_exists ("/ tmp /test.txt")) { die("File not found"); } else { $file = fopen("/ tmp / test.txt" , "r " ); print "Opend file sucessfully"; } // Test of the code here. ?>
Таким образом, вы можете написать эффективный код. Используя вышеприведенную технику, вы можете остановить свою программу всякий раз, когда она выдает ошибки и отображает более содержательные и удобные для пользователя сообщения.
Определение пользовательской функции обработки ошибок
Вы можете написать свою собственную функцию для обработки любой ошибки. PHP предоставляет вам структуру для определения функции обработки ошибок.
Эта функция должна иметь возможность обрабатывать минимум два параметра (уровень ошибки и сообщение об ошибке), но может принимать до пяти параметров (опционально: файл, номер строки и контекст ошибки) —
Синтаксис
error_function(error_level,error_message, error_file,error_line,error_context);
# | Параметр | Описание |
---|---|---|
1 | error_level | Обязательный параметр — задает уровень отчета об ошибке для пользовательской ошибки. Значение должно быть числом. |
2 | error_message | Обязательный параметр — указывает сообщение об ошибке для пользовательской ошибки |
3 | error_file | Необязательный. Указывает имя файла, в котором произошла ошибка. |
4 | error_line | Необязательный. Указывает номер строки, в которой произошла ошибка. |
5 | error_context | Необязательный. Указывает массив, содержащий каждую переменную, и их значения, используемые при возникновении ошибки. |
Возможные уровни ошибок
Эти уровни отчетов об ошибках представляют собой различные типы ошибок, к которым может использоваться пользовательский обработчик ошибок. Эти значения используются в комбинации с использованием | оператор
# | Константа | Описание | Значение |
---|---|---|---|
1 | .E_ERROR | Неустранимая ошибки во время выполнения. Выполнение сценария останавливается | 1 |
2 | E_WARNING | Нефатальные ошибки во время выполнения. Выполнение скрипта не останавливается | 2 |
3 | E_PARSE | Ошибки анализа времени компиляции. Ошибки анализа должны генерироваться только парсером. | 4 |
4 | E_NOTICE | Уведомления о времени выполнения. Скрипт нашел что-то, что может быть ошибкой, но может также произойти при обычном сценарии | 8 |
5 | E_CORE_ERROR | Неустранимая ошибки, возникающие во время первоначального запуска PHP. | 16 |
6 | E_CORE_WARNING | Нефатальные ошибки во время выполнения. Это происходит во время первоначального запуска PHP. | 32 |
7 | E_USER_ERROR | Неустранимая пользовательская ошибка. Это похоже на набор E_ERROR программиста, использующий функцию PHP trigger_error() | 256 |
8 | E_USER_WARNING | Нефатальное пользовательское предупреждение. Это похоже на E_WARNING, установленный программистом с использованием функции PHP trigger_error() | 512 |
9 | E_USER_NOTICE | Пользовательское уведомление. Это похоже на набор E_NOTICE, заданный программистом с использованием функции PHP trigger_error() | 1024 |
10 | E_STRICT | Уведомления о времени выполнения. Включите, чтобы PHP предлагал изменения в вашем коде, что обеспечит лучшую совместимость и передовую совместимость вашего кода. | 2048 |
11 | E_RECOVERABLE_ERROR | Ловкая ошибка. Это похоже на E_ERROR, но может быть захвачен определяемым пользователем дескриптором (см. Также set_error_handler()) | 4096 |
12 | E_ALL | Все ошибки и предупреждения, кроме уровня E_STRICT(E_STRICT будет частью E_ALL с PHP 6.0) | 8191 |
Все указанные выше уровни ошибок можно задать, используя встроенную библиотечную функцию PHP, где уровень ошибки будет любым значением, определенным в таблице выше.
int error_reporting ([ int $ level])
Ниже приведен способ создания одной функции обработки ошибок —
<?php function handleError($errno, $errstr,$error_file,$error_line) { echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line"; echo " "; echo "Terminating PHP Script"; die(); } ?>
После того, как вы определили свой собственный обработчик ошибок, вам нужно установить его с помощью встроенной библиотеки set_error_handler. Теперь давайте рассмотрим пример, вызвав функцию, которая не существует.
<?php error_reporting( E_ERROR ); function handleError($errno, $errstr,$error_file,$error_line) { echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line"; echo " "; echo "Terminating PHP Script"; die(); } //set error handler set_error_handler("handleError"); //trigger error myFunction(); ?>
Обработка исключений
PHP 5 имеет модель исключения, аналогичную модели других языков программирования. Исключения важны и обеспечивают лучший контроль над обработкой ошибок. Позволяет объяснить там новое ключевое словосвязанное с исключениями.
- Try — функция, использующая исключение, должна находиться в блоке «try». Если исключение не запускается, код будет продолжен как обычно. Однако, если исключение инициируется, исключение «бросается».
- Throw — это то , как вы вызываете исключение. Каждый «бросок» должен иметь хотя бы один «улов».
- Catch. Блок «catch» извлекает исключение и создает объект, содержащий информацию об исключении.
- Когда генерируется исключение, код, следующий за оператором, не будет выполнен, а PHP попытается найти первый соответствующий блок catch. Если исключение не поймано, PHP Fatal Error будет выпущена с помощью «Uncaught Exception …»
- Исключение может быть выброшено, и поймал ( « пойманный ») в PHP. Код может быть окружен в блоке try.
- Каждая попытка должна иметь по крайней мере один соответствующий блок catch. Для блокировки различных классов исключений можно использовать несколько блоков catch.
- Исключения могут быть сброшены (или повторно выбраны) в блоке catch.
пример
Ниже приведен фрагмент кода, скопируйте и вставьте этот код в файл и проверьте результат.
<?php try { $error = 'Always throw this error'; throw new Exception($error); // Code following an exception is not executed. echo 'Never executed'; }catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "n"; } // Continue execution echo 'Hello World'; ?>
В приведенном выше примере функция $e->getMessage
используется для получения сообщения об ошибке. Существуют следующие функции, которые могут использоваться из класса Exception.
- GetMessage() — сообщение об исключении
- GetCode() — код исключения
- GetFile() — исходное имя файла
- GetLine() — исходная строка
- GetTrace() — n массив backtrace()
- GetTraceAsString() — сформированная строка трассировки
Создание настраиваемого обработчика исключений
Вы можете определить собственный собственный обработчик исключений. Используйте следующую функцию для установки пользовательской функции обработчика исключений.
string set_exception_handler(callback $exception_handler)
Здесь exception_handler — это имя вызываемой функции, когда происходит неперехваченное исключение. Эта функция должна быть определена перед вызовом set_exception_handler().
пример
<?php function exception_handler($exception) { echo "Uncaught exception: " , $exception->getMessage(), "n"; } set_exception_handler('exception_handler'); throw new Exception('Uncaught Exception'); echo "Not Executedn"; ?>
С уважением, авторы сайта Компьютерапия
Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!
Error handling is the process of catching errors raised by your program and then taking appropriate action. If you would handle errors properly then it may lead to many unforeseen consequences.
Its very simple in PHP to handle an errors.
Using die() function
While writing your PHP program you should check all possible error condition before going ahead and take appropriate action when required.
Try following example without having /tmp/test.xt file and with this file.
<?php if(!file_exists("/tmp/test.txt")) { die("File not found"); }else { $file = fopen("/tmp/test.txt","r"); print "Opend file sucessfully"; } // Test of the code here. ?>
This way you can write an efficient code. Using above technique you can stop your program whenever it errors out and display more meaningful and user friendly message.
Defining Custom Error Handling Function
You can write your own function to handling any error. PHP provides you a framework to define error handling function.
This function must be able to handle a minimum of two parameters (error level and error message) but can accept up to five parameters (optionally: file, line-number, and the error context) −
Syntax
error_function(error_level,error_message, error_file,error_line,error_context);
Sr.No | Parameter & Description |
---|---|
1 |
error_level Required — Specifies the error report level for the user-defined error. Must be a value number. |
2 |
error_message Required — Specifies the error message for the user-defined error |
3 |
error_file Optional — Specifies the file name in which the error occurred |
4 |
error_line Optional — Specifies the line number in which the error occurred |
5 |
error_context Optional — Specifies an array containing every variable and their values in use when the error occurred |
Possible Error levels
These error report levels are the different types of error the user-defined error handler can be used for. These values cab used in combination using | operator
Sr.No | Constant & Description | Value |
---|---|---|
1 |
.E_ERROR Fatal run-time errors. Execution of the script is halted |
1 |
2 |
E_WARNING Non-fatal run-time errors. Execution of the script is not halted |
2 |
3 |
E_PARSE Compile-time parse errors. Parse errors should only be generated by the parser. |
4 |
4 |
E_NOTICE Run-time notices. The script found something that might be an error, but could also happen when running a script normally |
8 |
5 |
E_CORE_ERROR Fatal errors that occur during PHP’s initial start-up. |
16 |
6 |
E_CORE_WARNING Non-fatal run-time errors. This occurs during PHP’s initial start-up. |
32 |
7 |
E_USER_ERROR Fatal user-generated error. This is like an E_ERROR set by the programmer using the PHP function trigger_error() |
256 |
8 |
E_USER_WARNING Non-fatal user-generated warning. This is like an E_WARNING set by the programmer using the PHP function trigger_error() |
512 |
9 |
E_USER_NOTICE User-generated notice. This is like an E_NOTICE set by the programmer using the PHP function trigger_error() |
1024 |
10 |
E_STRICT Run-time notices. Enable to have PHP suggest changes to your code which will ensure the best interoperability and forward compatibility of your code. |
2048 |
11 |
E_RECOVERABLE_ERROR Catchable fatal error. This is like an E_ERROR but can be caught by a user defined handle (see also set_error_handler()) |
4096 |
12 |
E_ALL All errors and warnings, except level E_STRICT (E_STRICT will be part of E_ALL as of PHP 6.0) |
8191 |
All the above error level can be set using following PHP built-in library function where level cab be any of the value defined in above table.
int error_reporting ( [int $level] )
Following is the way you can create one error handling function −
<?php function handleError($errno, $errstr,$error_file,$error_line) { echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line"; echo "<br />"; echo "Terminating PHP Script"; die(); } ?>
Once you define your custom error handler you need to set it using PHP built-in library set_error_handler function. Now lets examine our example by calling a function which does not exist.
<?php error_reporting( E_ERROR ); function handleError($errno, $errstr,$error_file,$error_line) { echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line"; echo "<br />"; echo "Terminating PHP Script"; die(); } //set error handler set_error_handler("handleError"); //trigger error myFunction(); ?>
Exceptions Handling
PHP 5 has an exception model similar to that of other programming languages. Exceptions are important and provides a better control over error handling.
Lets explain there new keyword related to exceptions.
-
Try − A function using an exception should be in a «try» block. If the exception does not trigger, the code will continue as normal. However if the exception triggers, an exception is «thrown».
-
Throw − This is how you trigger an exception. Each «throw» must have at least one «catch».
-
Catch − A «catch» block retrieves an exception and creates an object containing the exception information.
When an exception is thrown, code following the statement will not be executed, and PHP will attempt to find the first matching catch block. If an exception is not caught, a PHP Fatal Error will be issued with an «Uncaught Exception …
-
An exception can be thrown, and caught («catched») within PHP. Code may be surrounded in a try block.
-
Each try must have at least one corresponding catch block. Multiple catch blocks can be used to catch different classes of exceptions.
-
Exceptions can be thrown (or re-thrown) within a catch block.
Example
Following is the piece of code, copy and paste this code into a file and verify the result.
<?php try { $error = 'Always throw this error'; throw new Exception($error); // Code following an exception is not executed. echo 'Never executed'; }catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "n"; } // Continue execution echo 'Hello World'; ?>
In the above example $e->getMessage function is used to get error message. There are following functions which can be used from Exception class.
-
getMessage() − message of exception
-
getCode() − code of exception
-
getFile() − source filename
-
getLine() − source line
-
getTrace() − n array of the backtrace()
-
getTraceAsString() − formated string of trace
Creating Custom Exception Handler
You can define your own custom exception handler. Use following function to set a user-defined exception handler function.
string set_exception_handler ( callback $exception_handler )
Here exception_handler is the name of the function to be called when an uncaught exception occurs. This function must be defined before calling set_exception_handler().
Example
<?php function exception_handler($exception) { echo "Uncaught exception: " , $exception->getMessage(), "n"; } set_exception_handler('exception_handler'); throw new Exception('Uncaught Exception'); echo "Not Executedn"; ?>
Check complete set of error handling functions at PHP Error Handling Functions