Php set error handler warning



set_error_handler — Задает определенный пользователем обработчик ошибок

(PHP 4 >= 4.0.1, PHP 5, PHP 7)

set_error_handler — Задает определенный пользователем обработчик ошибок

Описание

Задает пользовательскую функцию ( error_handler ), как обработчик ошибок в скрипте.

Эта функция используется для определения собственного обработчика ошибок времени выполнения скрипта. Например, если требуется очистить данные/файлы, когда произошла критическая ошибка, или если нужно переключить тип ошибки, исходя из каких-то условий (используя функцию trigger_error() ).

Важно помнить, что стандартный обработчик ошибок PHP не будет обрабатывать никакие типы ошибок, определенные в error_types , пока callback-функция не вернет FALSE . Пользовательский обработчик будет вызываться при любой ошибке, независимо от настроек, заданных функцией error_reporting() . Однако, вы можете прочитать текущее значение error_reporting и задать в обработчике соответствующие действия. В частности, это значение будет равно 0, если выражение, вызвавшее ошибку, начинается с оператора контроля ошибок @.

Также важно помнить, что на совести обработчика лежит вызов функции die() в случае необходимости. Если происходит возврат их обработчика ошибок, управление передается следующему выражению, стоящему за тем, что вызвало ошибку.

Ошибки следующих типов не могут быть обработаны пользователем: E_ERROR , E_PARSE , E_CORE_ERROR , E_CORE_WARNING , E_COMPILE_ERROR , E_COMPILE_WARNING , и большинство E_STRICT ошибок, произошедших в файле, где вызвана функция set_error_handler() .

Если ошибки возникают до запуска скрипта (например, пока файл загружается), пользовательский обработчик не будет вызываться, если на этот момент он еще не зарегистрирован.

Список параметров

Функция указанного ниже вида. Можно передать вместо нее NULL , для сброса обработчика в значение по умолчанию. Помимо имени функции, можно передать массив, содержащий объект и имя метода.

Если функция возвращает FALSE , управление передается встроенному обработчику ошибок.

Может использоваться для задания маски, в соответствии с которой будет вызываться error_handler , по аналогии с ini настройкой error_reporting, которая отвечает за то, какие ошибки будут показаны в отчете. Без этой маски error_handler будет вызываться для обработки всех происходящих ошибок, вне зависимости от настроек в error_reporting.

Возвращаемые значения

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

Список изменений

Версия Описание
5.5.0 error_handler теперь может принимать NULL .
5.2.0 Обработчик должен вернуть FALSE , чтобы заполнилось значение переменной $php_errormsg .

Примеры

Пример #1 Обработка ошибок с помощью функций set_error_handler() и trigger_error()

Пример ниже демонстрирует обработку внутренних исключений путем вызова ошибок разных типов и их обработки пользовательской функцией:

// функция обработки ошибок
function myErrorHandler ( $errno , $errstr , $errfile , $errline )
<
if (!( error_reporting () & $errno )) <
// Этот код ошибки не включен в error_reporting
return;
>

switch ( $errno ) <
case E_USER_ERROR :
echo «My ERROR [ $errno ] $errstr
\n» ;
echo » Фатальная ошибка в строке $errline файла $errfile » ;
echo «, PHP » . PHP_VERSION . » (» . PHP_OS . «)
\n» ;
echo «Завершение работы.
\n» ;
exit( 1 );
break;

case E_USER_WARNING :
echo «My WARNING [ $errno ] $errstr
\n» ;
break;

case E_USER_NOTICE :
echo «My NOTICE [ $errno ] $errstr
\n» ;
break;

default:
echo «Неизвестная ошибка: [ $errno ] $errstr
\n» ;
break;
>

/* Не запускаем внутренний обработчик ошибок PHP */
return true ;
>

// функция для тестирования обработчика ошибок
function scale_by_log ( $vect , $scale )
<
if (! is_numeric ( $scale ) || $scale 0 ) <
trigger_error ( «log(x) для x $scale » , E_USER_ERROR );
>

if (! is_array ( $vect )) <
trigger_error ( «Некорректный входной вектор, пропущен массив значений» , E_USER_WARNING );
return null ;
>

$temp = array();
foreach( $vect as $pos => $value ) <
if (! is_numeric ( $value )) <
trigger_error ( «Значение на позиции $pos не является числом, будет использован 0 (ноль)» , E_USER_NOTICE );
$value = 0 ;
>
$temp [ $pos ] = log ( $scale ) * $value ;
>

// переключаемся на пользовательский обработчик
$old_error_handler = set_error_handler ( «myErrorHandler» );

// вызовем несколько ошибок, во-первых, определим массив с нечисловым элементом
echo «vector a\n» ;
$a = array( 2 , 3 , «foo» , 5.5 , 43.3 , 21.11 );
print_r ( $a );

// теперь создадим еще один массив
echo «—-\nvector b — a notice (b = log(PI) * a)\n» ;
/* Значение на позиции $pos не является числом, будет использован 0 (ноль)*/
$b = scale_by_log ( $a , M_PI );
print_r ( $b );

// проблема, мы передаем строку вместо массива
echo «—-\nvector c — a warning\n» ;
/* Некорректный входной вектор, пропущен массив значений */
$c = scale_by_log ( «not array» , 2.3 );
var_dump ( $c ); // NULL

// критическая ошибка, логарифм от неположительного числа не определен
echo «—-\nvector d — fatal error\n» ;
/* log(x) для x $d = scale_by_log ( $a , — 2.5 );
var_dump ( $d ); // До сюда не доберемся никогда
?>

Результатом выполнения данного примера будет что-то подобное:

Смотрите также

  • ErrorException
  • error_reporting() — Задает, какие ошибки PHP попадут в отчет
  • restore_error_handler() — Восстанавливает предыдущий обработчик ошибок
  • trigger_error() — Вызывает пользовательскую ошибку/предупреждение/уведомление
  • Константы уровней ошибок
  • информация о типе callback

Источник

Exceptions

Table of Contents

PHP has an exception model similar to that of other programming languages. An exception can be throw n, and caught (» catch ed») within PHP. Code may be surrounded in a try block, to facilitate the catching of potential exceptions. Each try must have at least one corresponding catch or finally block.

If an exception is thrown and its current function scope has no catch block, the exception will «bubble up» the call stack to the calling function until it finds a matching catch block. All finally blocks it encounters along the way will be executed. If the call stack is unwound all the way to the global scope without encountering a matching catch block, the program will terminate with a fatal error unless a global exception handler has been set.

The thrown object must be an instanceof Throwable . Trying to throw an object that is not will result in a PHP Fatal Error.

As of PHP 8.0.0, the throw keyword is an expression and may be used in any expression context. In prior versions it was a statement and was required to be on its own line.

catch

A catch block defines how to respond to a thrown exception. A catch block defines one or more types of exception or error it can handle, and optionally a variable to which to assign the exception. (The variable was required prior to PHP 8.0.0.) The first catch block a thrown exception or error encounters that matches the type of the thrown object will handle the object.

Multiple catch blocks can be used to catch different classes of exceptions. Normal execution (when no exception is thrown within the try block) will continue after that last catch block defined in sequence. Exceptions can be throw n (or re-thrown) within a catch block. If not, execution will continue after the catch block that was triggered.

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 . » message, unless a handler has been defined with set_exception_handler() .

As of PHP 7.1.0, a catch block may specify multiple exceptions using the pipe ( | ) character. This is useful for when different exceptions from different class hierarchies are handled the same.

As of PHP 8.0.0, the variable name for a caught exception is optional. If not specified, the catch block will still execute but will not have access to the thrown object.

finally

A finally block may also be specified after or instead of catch blocks. Code within the finally block will always be executed after the try and catch blocks, regardless of whether an exception has been thrown, and before normal execution resumes.

One notable interaction is between the finally block and a return statement. If a return statement is encountered inside either the try or the catch blocks, the finally block will still be executed. Moreover, the return statement is evaluated when encountered, but the result will be returned after the finally block is executed. Additionally, if the finally block also contains a return statement, the value from the finally block is returned.

Global exception handler

If an exception is allowed to bubble up to the global scope, it may be caught by a global exception handler if set. The set_exception_handler() function can set a function that will be called in place of a catch block if no other block is invoked. The effect is essentially the same as if the entire program were wrapped in a try — catch block with that function as the catch .

Notes

Internal PHP functions mainly use Error reporting, only modern Object-oriented extensions use exceptions. However, errors can be easily translated to exceptions with ErrorException. This technique only works with non-fatal errors, however.

Example #1 Converting error reporting to exceptions

function exceptions_error_handler ( $severity , $message , $filename , $lineno ) <
throw new ErrorException ( $message , 0 , $severity , $filename , $lineno );
>

Examples

Example #2 Throwing an Exception

function inverse ( $x ) <
if (! $x ) <
throw new Exception ( ‘Division by zero.’ );
>
return 1 / $x ;
>

try <
echo inverse ( 5 ) . «\n» ;
echo inverse ( 0 ) . «\n» ;
> catch ( Exception $e ) <
echo ‘Caught exception: ‘ , $e -> getMessage (), «\n» ;
>

// Continue execution
echo «Hello World\n» ;
?>

The above example will output:

Example #3 Exception handling with a finally block

function inverse ( $x ) <
if (! $x ) <
throw new Exception ( ‘Division by zero.’ );
>
return 1 / $x ;
>

try <
echo inverse ( 5 ) . «\n» ;
> catch ( Exception $e ) <
echo ‘Caught exception: ‘ , $e -> getMessage (), «\n» ;
> finally <
echo «First finally.\n» ;
>

try <
echo inverse ( 0 ) . «\n» ;
> catch ( Exception $e ) <
echo ‘Caught exception: ‘ , $e -> getMessage (), «\n» ;
> finally <
echo «Second finally.\n» ;
>

// Continue execution
echo «Hello World\n» ;
?>

The above example will output:

Example #4 Interaction between the finally block and return

function test () <
try <
throw new Exception ( ‘foo’ );
> catch ( Exception $e ) <
return ‘catch’ ;
> finally <
return ‘finally’ ;
>
>

The above example will output:

Example #5 Nested Exception

class Test <
public function testing () <
try <
try <
throw new MyException ( ‘foo!’ );
> catch ( MyException $e ) <
// rethrow it
throw $e ;
>
> catch ( Exception $e ) <
var_dump ( $e -> getMessage ());
>
>
>

$foo = new Test ;
$foo -> testing ();

The above example will output:

Example #6 Multi catch exception handling

class MyOtherException extends Exception

class Test <
public function testing () <
try <
throw new MyException ();
> catch ( MyException | MyOtherException $e ) <
var_dump ( get_class ( $e ));
>
>
>

$foo = new Test ;
$foo -> testing ();

The above example will output:

Example #7 Omitting the caught variable

Only permitted in PHP 8.0.0 and later.

class SpecificException extends Exception <>

function test () <
throw new SpecificException ( ‘Oopsie’ );
>

try <
test ();
> catch ( SpecificException ) <
print «A SpecificException was thrown, but we don’t care about the details.» ;
>
?>

Example #8 Throw as an expression

Only permitted in PHP 8.0.0 and later.

class SpecificException extends Exception <>

function test () <
do_something_risky () or throw new Exception ( ‘It did not work’ );
>

try <
test ();
> catch ( Exception $e ) <
print $e -> getMessage ();
>
?>

User Contributed Notes 13 notes

If you intend on creating a lot of custom exceptions, you may find this code useful. I’ve created an interface and an abstract exception class that ensures that all parts of the built-in Exception class are preserved in child classes. It also properly pushes all information back to the parent constructor ensuring that nothing is lost. This allows you to quickly create new exceptions on the fly. It also overrides the default __toString method with a more thorough one.

interface IException
<
/* Protected methods inherited from Exception class */
public function getMessage (); // Exception message
public function getCode (); // User-defined Exception code
public function getFile (); // Source filename
public function getLine (); // Source line
public function getTrace (); // An array of the backtrace()
public function getTraceAsString (); // Formated string of trace

/* Overrideable methods inherited from Exception class */
public function __toString (); // formated string for display
public function __construct ( $message = null , $code = 0 );
>

abstract class CustomException extends Exception implements IException
<
protected $message = ‘Unknown exception’ ; // Exception message
private $string ; // Unknown
protected $code = 0 ; // User-defined exception code
protected $file ; // Source filename of exception
protected $line ; // Source line of exception
private $trace ; // Unknown

public function __construct ( $message = null , $code = 0 )
<
if (! $message ) <
throw new $this ( ‘Unknown ‘ . get_class ( $this ));
>
parent :: __construct ( $message , $code );
>

public function __toString ()
<
return get_class ( $this ) . » ‘ < $this ->message > ‘ in < $this ->file > ( < $this ->line > )\n»
. » < $this ->getTraceAsString ()> » ;
>
>
?>

Now you can create new exceptions in one line:

class TestException extends CustomException <>
?>

Here’s a test that shows that all information is properly preserved throughout the backtrace.

function exceptionTest ()
<
try <
throw new TestException ();
>
catch ( TestException $e ) <
echo «Caught TestException (‘ < $e ->getMessage ()> ‘)\n < $e >\n» ;
>
catch ( Exception $e ) <
echo «Caught Exception (‘ < $e ->getMessage ()> ‘)\n < $e >\n» ;
>
>

echo » ;
?>

Here’s a sample output:

Источник

Читайте также:  Binascii error non hexadecimal digit found
Оцените статью
toolgir.ru
Adblock
detector