The backtrace of ErrorException is broken in PHP 5.2 (listed at http://bugs.php.net/bug.php?id=46449 and explained at http://bugs.php.net/bug.php?id=45895#c140511).
A simple fix for your exception handler:
<?php
$backtrace = $exception->getTrace();
if ($exception instanceof ErrorException) {
for ($i = count($backtrace) - 1; $i > 0; --$i) {
$backtrace[$i]['args'] = $backtrace[$i - 1]['args'];
}
}
?>
ErrorException
Einführung
Eine Error Exception.
Klassenbeschreibung
ErrorException
ErrorException
extends
Exception
{
/* Eigenschaften */
/* Methoden */
public ErrorException::__construct
([ string $message
[, int $code
[, int $severity
[, string $filename
[, int $lineno
]]]]] )
/* Geerbte Methoden */
}Eigenschaften
- severity
-
Die Schwere einer Exception
Beispiele
Beispiel #1 Verlagern aller Fehlermeldungen nach ErrorException.
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
/* Exception ausloesen */
strpos();
?>
Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:
Fatal error: Uncaught exception 'ErrorException' with message 'Wrong parameter count for strpos()' in /home/bjori/tmp/ex.php:8 Stack trace: #0 [internal function]: exception_error_handler(2, 'Wrong parameter...', '/home/bjori/php...', 8, Array) #1 /home/bjori/php/cleandocs/test.php(8): strpos() #2 {main} thrown in /home/bjori/tmp/ex.php on line 8
Inhaltsverzeichnis
- ErrorException::__construct — Erstellt die Exception
- ErrorException::getSeverity — Liefert die Schwere der Exception
ErrorException
chris AT cmbuckley DOT co DOT uk
13-Nov-2008 02:24
13-Nov-2008 02:24
makariverslund at gmail dot com
10-Sep-2008 04:08
10-Sep-2008 04:08
Building upon the notes present, here is a set of functions that transforms the error into an exception and reports the error to screen / log depending upon the PHP ini settings.
//Begin helper function definition
function ReportError ($msg)
{
// be sure that the supplied parameter is a string and not empty
if (empty ($msg) || !is_string ($msg))
{
throw new ErrorException ('Invalid parameter supplied to ReportError', 0, E_ERROR);
}
// retrieve error settings
$display = strtolower (ini_get ('display_errors'));
$log = strtolower (ini_get ('log_errors'));
// check if we're displaying errors
if ($display === 'on' || $display === '1' || $display === 1 || $display === 'true' || $display === true)
{
echo $msg;
}
// check if we're logging errors
if ($log === 'on' || $log === '1' || $log === 1 || $log === 'true' || $log === true)
{
$result = error_log ($msg);
// check for error while logging
if (!$result)
{
throw new ErrorException ('Attempt to write message to error log failed in ReportError', 0, E_ERROR);
}
}
}
//Begin main function definition
function ErrorsAsExceptions ($level, $msg, $fileName, $lineNumber)
{
// do nothing if error reporting is turned off
if (error_reporting () === 0)
{
return;
}
// be sure received error is supposed to be reported
if (error_reporting () & $level)
{
try
{
// report error to appropriate channels
ReportError ($reportMsg);
}
catch (ErrorException $e)
{
// ignore errors while reporting
}
// go ahead and throw the exception
throw new ErrorException ($msg, 0, $level, $fileName, $lineNumber);
}
}
troelskn at gmail dot com
29-Jul-2008 02:08
29-Jul-2008 02:08
The following snippet installs an error-handler that turns errors into exceptions. It respects error-reporting level, so that you can still use error-suppression:
<?php
function exceptions_error_handler($severity, $message, $filename, $lineno) {
if (error_reporting() == 0) {
return;
}
if (error_reporting() & $severity) {
throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
}
set_error_handler('exceptions_error_handler');
?>
