烦恼:之前总是在控制器每个方法中重复写try catch异常捕获感觉非常繁琐
// 之前写的 伪代码
class DemoController
{
public function test(Request $request) {
try{
// 业务逻辑
} catch (ValidationException $e) {
// 验证器处理
} catch (ApiException $e) {
// 自定义异常处理
} catch (\Exception $e) {
// 系统异常处理
}
}
}
下面是修改之后的处理方式
第一步:
// 在support目录下创建Exception.php
namespace support;
use Throwable;
use Webman\Http\Request;
use Webman\Http\Response;
use App\api\Exception\ApiException;
use Respect\Validation\Exceptions\ValidationException;
class Exception extends \Webman\Exception\ExceptionHandler
{
public function render(Request $request, Throwable $exception): Response
{
if ($exception instanceof ValidationException) {
// 验证器异常处理
return json(['code'=>500, 'msg'=>$exception->getMessage()]);
}
if ($exception instanceof ApiException){
// 自定义异常处理
return json(['code'=>500, 'msg'=>$exception->getMessage()]);
}
if ($exception instanceof Throwable) {
// 记录错误日志
Log::error($exception->getMessage());
return json(['code'=>500, 'msg'=>'系统异常']);
}
return parent::render($request, $exception); // TODO: Change the autogenerated stub
}
}
第二步:
// 修改config/exception.php配置文件
return [
// '' => support\exception\Handler::class,
'api' => support\Exception::class,
];
现在在控制器写法伪代码
class DemoController
{
public function test(Request $request) {
// 直接抛出异常
throw new ApiException('自定义异常');
}
}
看了一下 很不错 感谢分享
框架新版本businessExeption支持render方法,重写exceptionHandler都可以免了。
直接抛businessExeption异常,或自己写个类继承businessExeption并重写render。
直接报错 Undefined array key "event_trigger" in /Users/wulinzhu/Documents/恒昌/项目/irm/vendor/tinywan/exception-handler/src/Handler.php:186 没读到配置文件,奇怪
我的
控制器转发
manager业务服务
service基础服务
dao数据处理
WebmanException 子定义,继承Exception
\PDOException | \Exception | \Error 其它特殊异常
Throwable 兜底
感谢分享