set_exception_handler()没有捕获异常

时间:2013-12-21 18:13:41

标签: php exception

我正在构建我的错误报告系统的基础知识,基本上我已经设置了这两个坏男孩

class System {
    public function __construct(){
        set_exception_handler(array($this, 'handleExceptions'));
        set_error_handler(array($this, 'handleGenericError'));
    }

    public function handleExceptions(\Exception $e){
        echo "<pre>".print_r($e, true)."</pre>";
    }

    public function handleGenericError($no, $msg, $file, $line, $context){
        $msg .= ' in ['.$file.'] on line ['.$line.']';
        throw new \Exception($msg);
    }
}

然后我在声明之后在__construct方法中引发错误。语句如

public function __construct(){
    ....
    echo $undefined_variable;
}

public function __construct(){
    ....
    echo $this->undefined_variable;
}

似乎顺利,打印一个很好的可读异常消息,但如果我这样做

public function __construct(){
    ....
    echo $this->$undefined_variable;
}

我得到一个未被捕获的例外。这是为什么?抛出的异常来自handleGenericError方法,我可以告诉它,因为它周围有[]个东西。这有点令人困惑。 :/

1 个答案:

答案 0 :(得分:1)

问题 - 我认为 - 就是这样:

public function __construct(){
    ....
    echo $this->$undefined_variable;
}

最有可能导致:

echo $this->[null];

当您执行$this->$undefined_variable之类的作业时,我相信PHP会将其解析为“将变量$undefined_variable的值分配给$this->之后的正确值。” 意味着它甚至没有进入处理程序,因为100%的东西都没有。它只是一个空值。就像你打电话:

echo $this->;

这是一个更大的程序逻辑失败,因为所有异常处理程序都会捕获成功获取它的错误。对$this->的调用是课堂范围之外的基本逻辑失败。其中的异常处理程序。您可以阅读how exception handlers in PHP work here