php优雅处理业务异常输出数据
2022年7月26日14:50:20
通常我们在mvc框架处理的时候,在控制器里面基本都这么写
class TestController extends BaseController
{
use ResponseTrait;
public function index(Request $request)
{
// $iterator = new ArrayIterator(array('recipe' => 'pancakes', 'egg', 'milk', 'flour'));
// p(iterator_count($iterator));
try {
throw new Exception('111111111');
} catch (Throwable $e) {
return $this->fails($e);
}
// return view('welcome');
}
trait代码
trait ResponseTrait
{
public function success(mixed $data = '', string $msg = '操作成功')
{
return response()->json(['code' => GlobalCode::SUCCESS, 'msg' => $msg, 'data' => $data]);
}
public function fail(Exception $e, $status = 200, array $headers = [])
{
if (request()->debug == env('DEBUG', GlobalCode::DEBUG) || env('DEBUG') == GlobalCode::DEBUG) {
return response()->json(['code' => GlobalCode::FAIL, 'msg' => $e->getMessage(), 'data' => $e->getTraceAsString()], $status, $headers);
} else {
return response()->json(['code' => GlobalCode::FAIL, 'msg' => $e->getMessage(), 'data' => $e->getMessage()], $status, $headers);
}
}
public function grant(Exception $e)
{
if (request()->debug == env('DEBUG', GlobalCode::DEBUG) || env('DEBUG') == GlobalCode::DEBUG) {
return response()->json(['code' => GlobalCode::GRANT, 'msg' => $e->getMessage(), 'data' => $e->getTraceAsString()]);
} else {
return response()->json(['code' => GlobalCode::GRANT, 'msg' => $e->getMessage(), 'data' => $e->getMessage()]);
}
}
public function successMsg(string $msg = 'success')
{
return response()->json(['code' => GlobalCode::SUCCESS, 'msg' => $msg, 'data' => $msg]);
}
public function failMsg(string|array $msg = 'success')
{
return response()->json(['code' => GlobalCode::FAIL, 'msg' => $msg, 'data' => $msg]);
}
}
如果业务逻辑异常比较多比如
use RuntimeException; //系统异常
use LogicException; //业务逻辑异常
use App\Exceptions\AuthorizeException; //授权异常
那么需要处理就需要写很多个返回方法
优化版本
public function fails(Throwable $e, $status = 200, array $headers = [])
{
try {
// p($e::class);
throw $e;
} catch (RuntimeException $runtimeException) {
return $this->ret(GlobalCode::FAIL, $runtimeException->getMessage(), $runtimeException->getTraceAsString());
} catch (LogicException $logicException) {
} catch (AuthorizeException $authorizeException) {
} catch (Exception $exception) {
} catch (Error $error) {
} finally {
}
}
public function ret(string $code, string $msg, string $trace)
{
if (request()->debug == env('DEBUG', GlobalCode::DEBUG) || env('DEBUG') == GlobalCode::DEBUG) {
return response()->json(['code' => $code, 'msg' => $msg, 'data' => $trace]);
} else {
return response()->json(['code' => $code, 'msg' => $msg, 'data' => $msg]);
}
}
这样各个异常都可以在一个方法里面返回,只需要在业务里面抛出对应的异常就可以
QQ一群 247823727
QQ二群 166427999
如果项目有技术瓶颈问题,请联系↓↓
QQ: 903464207
微信: zx903464207
QQ二群 166427999
如果项目有技术瓶颈问题,请联系↓↓
QQ: 903464207
微信: zx903464207
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!