PHP: set_exception_handler - Manual

downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

trigger_error set_error_handler

Last updated: Sat, 27 Jan 2007

view this page in

# set_exception_handler

(PHP 5)

set_exception_handler -- Sets a user-defined exception handler function

## Описание

string set_exception_handler ( callback exception_handler )

Sets the default exception handler if an exception is not caught within a try/catch block. Execution will stop after the `exception_handler` is called.

The `exception_handler` must be defined before calling set_exception_handler(). This handler function needs to accept one parameter, which will be the exception object that was thrown.

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

`exception_handler`

  Name of the function to be called when an uncaught exception occurs.

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

Returns the name of the previously defined exception handler, or `NULL` on error. If no previous handler was defined, `NULL` is also returned.

## Примеры

Пример 1. 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 Executed\n";
?>`

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

restore_exception_handler(), restore_error_handler(), error_reporting(), информация о типе callback, и PHP 5 Exceptions.

add a note User Contributed Notes
set_exception_handler
Glen
03-Mar-2007 12:34
`If you want a class instance to handle the exception, this is how you do it :
<?php
class example {
public function __construct() {
@set_exception_handler(array($this, 'exception_handler'));
throw new Exception('DOH!!');
}
public function exception_handler($exception) {
print "Exception Caught: ". $exception->getMessage() ."\n";
}
}
$example = new example;
?>
See the first post (Sean's) for a static example. As Sean points out, the exception_handler function must be declared public.`
mastabog at hotmail dot com
08-Aug-2006 07:44
`A behaviour not documented or discussed enough, yet pretty common is that is that if an exception is thrown from the global exception handler then a fatal error occurs (Exception thrown without a stack frame). That is, if you define your own global exception handler by calling set_exception_handler() and you throw an exception from inside it then this fatal error occurs. It is only natural though, as the callback defined by set_exception_handler() is only called on uncaught (unhandled) exceptions so if you throw one from there then you get this fatal error as there is no exception handler left (you override the php internal one by calling set_exception_handler()), hence no stack frame for it.
Example:
<?php
function myExceptionHandler (Exception $ex)
{
throw $ex;
}
set_exception_handler("myExceptionHandler");
throw new Exception("This should cause a fatal error and this message will be lost");
?>
Will cause a Fatal error: Exception thrown without a stack frame
If you skip/comment the set_exception_handler("...") line then the internal PHP global handler will catch the exception and output the exception message and trace (as string) to the browser, allowing you to at least see the exception message.
While it is a very good idea to always define your own global exception handler by using the set_exception_handler() function, you should pay attention and never throw an exception from it (or if you do then catch it).
Finally, every serious coder should use an IDE with debugging capabilities. Tracking down an error like this becomes a trivial matter by using simple debugging "Step into" commands (I for one recommend Zend IDE v5.2 at the moment of this writing). I have seen numerous messages on the internet with people wondering why this message pops up.
Cheers
p.s. Other causes for this error which are somehow unrelated to this is when you throw an exception from a destructor (the reasons behind that are similar though, the global handler might no longer exist due to the php engine shutting the page down).`
mc-php-doco at oak dot homeunix dot org
07-Apr-2006 09:41
`This seems not to work when calling the PHP binary with the '-r' flag.
For example, if I run it like this:
php -r '
function exception_handler($exception) {
echo "Uncaught exception: " , $exception->getMessage(), "\n";
}
set_exception_handler("exception_handler");
throw new Exception("Uncaught Exception");
echo "Not Executed\n";
'
Or if I place it in a file and run it like this:
php -r 'include "./tmp.php";'
I get a stack trace instead of having the function 'exception_handler' called. If run it like this:
php tmp.php
It works fine.
(Why run code from '-r'? Sometimes it's useful to add stuff around the include like calls to microtime for benchmarks, or to include a library and then call a few functions from the library, all in an ad-hoc way without having to create new files.)
PHP versions 5.1.2 and 5.0.4.`
ch at westend dot com
21-Feb-2006 07:06
`It seems that although the Exception contains a backtrace itself, the stack for the debug_backtrace() function is empty when entering an exception handler. This is very inconvinient. See bug #36477.`
sean at seanodonnell dot com
23-Oct-2005 04:48
`Using the 'set_exception_handler' function within a class, the defined 'exception_handler' method must be declared as 'public' (preferrable 'public static' if you use the "array('example', 'exception_handler')" syntax).
<?php
class example {
public function __construct() {
@set_exception_handler(array('example', 'exception_handler'));
throw new Exception('DOH!!');
}
public static function exception_handler($exception) {
print "Exception Caught: ". $exception->getMessage() ."\n";
}
}
$example = new example;
echo "Not Executed\n";
?>
Declaring the 'exception_handler' function as 'private' causes a FATAL ERROR.
[derick: red. updated statement about static a bit]`
add a note
trigger_error set_error_handler

Last updated: Sat, 27 Jan 2007
show source | credits | stats | sitemap | contact | advertising | mirror sites
Copyright © 2001-2007 The PHP Group
All rights reserved.
This mirror generously provided by: Yahoo! Inc.
Last updated: Sat Mar 10 09:32:46 2007 PST