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捕获。和正常代码没有任何区别。