<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");
strpos();
?>
请注意,在上面的示例中,ErrorException 类中的属性 $severity 对所有类型的错误都被设置为常量零。
我认为这是一个错误,并试图提交一个错误报告,但它被关闭了,因为它不是一个错误,所以我不能说上面是错误的。
让我举一个使用 $severity 不作为常量的例子
<?php
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
class MyClass {
public function methodA() {
echo("methodA:\n");
strpos();
}
public function methodB() {
echo("methodB:\n");
trigger_error("warning message form methodB", E_WARNING);
}
public function methodC() {
echo("methodC:\n");
throw new ErrorException();
}
public function methodD() {
echo("methodD:\n");
throw new ErrorException('warning message from methodD', 0,
E_WARNING);
}
public function run($i) {
if ($i === 0) {
$this->methodA();
} else if ($i === 1) {
$this->methodB();
} else if ($i === 2) {
$this->methodC();
} else {
$this->methodD();
}
}
public function test() {
for ($i = 0; $i < 4; ++$i) {
try {
$this->run($i);
} catch (ErrorException $e) {
if ($e->getSeverity() === E_ERROR) {
echo("E_ERROR triggered.\n");
} else if ($e->getSeverity() === E_WARNING) {
echo("E_WARNING triggered.\n");
}
}
}
}
}
$myClass = new MyClass();
$myClass->test();
?>
请注意,methodC() 使用 ErrorException 类(构造函数)的默认参数。
我认为最初的意图是让 $severity 具有默认值 1,这与 E_ERROR 完全相等。
使用属性 $code 或 Exception::getCode() 与 E_* 值进行比较不能做同样的事情(如在 methodC() 中),因为 $code 的默认值为 0,Exception 类也是如此,用户可能会将 $code 用于其他目的。