webman异常处理
全局处理一般是用这个函数 set_exception_handler
下面写个例子
<?php
namespace Demo;
// 自定义异常
class CustomException extends \Exception {
public function errorMessage() {
// 错误信息
return "\nError on line " . $this->getLine() . " in " . $this->getFile()
. ": " . $this->getMessage();
}
}
// 自定义异常处理
class CustomExceptionHandler {
public function render() {
echo "\n";
echo "CustomExceptionHandler";
echo "\n";
}
}
function handleException($exception) {
echo "\n";
echo "Caught exception: " . $exception->getMessage() . "\n";
echo "\n".get_class($exception);
// 这里可以做成一个k-v映射,或者按照一定规则对应
$handler = new (get_class($exception).'Handler')();
$handler->render();
echo $exception->errorMessage();
echo "\n";
echo "\n";
}
set_exception_handler('\Demo\handleException');
throw new \Demo\CustomException("Invalid data!");
输出
Caught exception: Invalid data!
Demo\CustomException
CustomExceptionHandler
Error on line 34 in /project/webman/catch_error.php: Invalid data!
我一开始以为webman也是类似这样的形式,
其实不是,webman是自己做了处理
webman的流程如下
主要是在 vendor/workerman/webman-framework/src/App.php 文件里
onMessage 方法 执行 static::send($connection, $callback($request), $request);
一层层执行完中间件后,执行路由对应的Controller,如果Controller这里抛出了异常
那么 回到那个 array_reduce 地方,捕捉到异常后,传递给异常处理器
异常处理器这里将参数给render方法
https://github.com/walkor/webman-framework/blob/97d8f4cb20e6a862ed1e0d4a236e5234f7aed0c0/src/App.php#L262
这个render 方法其实 是 ExceptionHandlerInterface 的,
ExceptionHandler 实现了 ExceptionHandlerInterface,
Handler 继承 ExceptionHandler 又重写了。
到这里就很清楚了,
这个 Handler 就是 config/exception.php 里面的 support\exception\Handler::class 。