If you want to control when the exception will be display or when not, you can change the value and enter if condition statement:
<?php
function lockdown($exception)
{
echo " <strong>lockdown:</strong> " , $exception->getMessage();
}
$lockdown = true; //you can change to false if you want to disable the lockdown.
if ($lockdown){
set_exception_handler('lockdown');
throw new Exception('the website is under construction, we will be back soon');
}
?>
the output will be:
lockdown: the website is under construcytion, we will be back soon
and nothing else will be shown in the entire website, just the lockdown comment.
ErrorException
導入
エラー例外です。
クラス概要
ErrorException
ErrorException
extends
Exception
{
/* プロパティ */
/* メソッド */
public __construct
([ string $message
[, int $code
[, int $severity
[, string $filename
[, int $lineno
]]]]] )
/* 継承したメソッド */
}プロパティ
- severity
-
例外の深刻度
例
例1 set_error_handler() を使用した、エラーメッセージから ErrorException への変換
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
/* 例外を発生させます */
strpos();
?>
上の例の出力は、 たとえば以下のようになります。
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
目次
- ErrorException::__construct — 例外を作成する
- ErrorException::getSeverity — 例外の深刻度を取得する
ErrorException
gozlan at nett dot co dot il
01-Jun-2009 10:00
01-Jun-2009 10:00
e dot sand at elisand dot com
26-Feb-2009 07:11
26-Feb-2009 07:11
If you're looking for a quick one-line way to change all errors in to Exceptions, you can do it this way:
set_error_handler(create_function('$a, $b, $c, $d', 'throw new ErrorException($b, 0, $a, $c, $d);'), E_ALL);
using create_function() saves you a few lines of code by embedding it all in to a single line, plus saves your namespace from a function name that should only ever be called in the event of an error (this saves from direct invocation).
luke at cywh dot com
23-Feb-2009 07:56
23-Feb-2009 07:56
To add to the comments made by chris AT cmbuckley DOT co DOT uk about the ErrorException problem with args:
I noticed that the problem is in the ErrorException class itself, not the Exception class. When using just the exception class, it's no longer an issue. Besides the args problem, the only difference between Exception and ErrorException in the stack trace is that the args are left out of the error handler exception function. I'm not sure if this was on purpose or not, but it shouldn't hurt to show this information anyway.
So instead of using this broken extended class, you can ignore it and make your own extended class and avoid the problem all together:
<?php
header('Content-Type: text/plain');
class ErrorHandler extends Exception {
protected $severity;
public function __construct($message, $code, $severity, $filename, $lineno) {
$this->message = $message;
$this->code = $code;
$this->severity = $severity;
$this->file = $filename;
$this->line = $lineno;
}
public function getSeverity() {
return $this->severity;
}
}
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorHandler($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler", E_ALL);
function A() {
$foo->bar; // Purposely cause error
}
function B($c) {
A();
}
try {
B('foobar');
} catch (Exception $e) {
var_dump($e->getTrace());
}
?>
The only thing I wish I could do was remove the entry for the error handler function because it's quite irrelevant. Maybe that's what they were trying to do with the ErrorException class? Either way, you can't change it because the trace functions are final, and the variable is private.
chris AT cmbuckley DOT co DOT uk
13-Nov-2008 12:24
13-Nov-2008 12:24
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'];
}
}
?>
makariverslund at gmail dot com
10-Sep-2008 01:08
10-Sep-2008 01: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 11:08
29-Jul-2008 11: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');
?>
