onExceptionHandle

异常的回调

如果在控制器方法执行过程中抛出了异常,那么会直接跳转到onExceptionHandle方法。

默认我们提供了一个异常处理。

    /**
     * 异常的回调
     * @param \Exception $e
     */
    public function onExceptionHandle(\Exception $e)
    {
        switch ($this->request_type) {
            case SwooleMarco::HTTP_REQUEST:
                $this->http_output->end($e->getMessage());
                break;
            case SwooleMarco::TCP_REQUEST:
                $this->send($e->getMessage());
                break;
        }
    }

如果需要修改请继承Controller。

实际上我们建议在你开始编写代码之前将Controller,Model, 等常用的类都继承一遍,变成自己业务的基类。这样才能保证框架更新的时候不会出现代码冲突问题。

由于协程的存在,异常嵌套处理比较麻烦,下面将其情况一一说明。
1.普通的controller异常测试,onExceptionHandle将接收到回调

/**
     * 普通的controller异常测试
     * @throws \Exception
     */
    public function http_testExceptionHandleII()
    {
        throw new \Exception('ExceptionHandle');
    }

2.普通model内的异常测试,onExceptionHandle将接收到回调

/**
     * 普通model的异常测试
     * @throws \Exception
     */
    public function http_testExceptionHandleIII()
    {
        $this->testModel = $this->loader->model('TestModel', $this);
        $result = $this->testModel->test_exception();
    }

3.协程的model内的异常测试,onExceptionHandle将接收到回调

/**
     * 协程的model报错需要增加try catch捕获,否则无法抛出
     */
    public function http_testExceptionHandleIV()
    {
        $this->testModel = $this->loader->model('TestModel', $this)$result = yield $this->testModel->test_exceptionII();
    }

4.总结:无论协程或者是多层协程嵌套,还是普通的代码,或者普通代码混合协程,都可以一路向上throw。并且可以通过try catch捕获。和正常代码没有任何区别。

results matching ""

    No results matching ""