1

假设我有一些类可以使用 MVC。控制器的基类有构造函数和析构函数。

class BaseController {
    public function __construct() {
        ob_start();

    }

    # Some code here.

    public function __destruct() {
        if(!error_get_last()) {
            if(!$this->doNotOutputBuffer) {
                $controllerContent = ob_get_contents();
                ob_clean();
                $this->_template->render($this->_appinfo['directory'], $this->templateOptions, $controllerContent);
            } else {
                $this->_template->render($this->_appinfo['directory'], $this->templateOptions);
            }
        }
    }
}

注意 ob_star() 和 ob_clean() 在每个函数上的存在,它应该将视图数据传递给模板类以使用模板渲染视图。当抛出异常时,我在 LoginController 之外的“TryCatch”块中捕获错误,但始终调用析构函数并且 error_get_last() 函数返回 NULL,无论如何,即使出现错误,视图也会被加载。

class LoginController extends BaseController{

    public function __construct() {
        parent::__construct();
    }

    public function main() {    
        throw new Exception("Error Fatal...");
    }

    public function __destruct() {
        parent::__destruct();
    }

}

我如何知道何时发生不显示视图的异常?

4

1 回答 1

0

添加标志和包装方法。

class LoginController extends BaseController{

    private $_is_throwed = false;

    public function __construct() {
        parent::__construct();
    }

    public function main() {
        try{
            $this->_main();
        } catch (Exception $e) {
            $this->_is_throwed = true;
            throw $e;
        }
    }

    private function _main() {
        throw new Exception("Error Fatal...");
    }

    public function __destruct() {
        if (!$this->_is_throwed) {
            parent::__destruct();
        } else {
            ob_clean();
        }
    }

}

PS 但是要小心在 destructs 中使用逻辑,它会引起麻烦。

于 2013-04-25T00:26:01.527 回答