laravel11: 全局异常设置和自定义异常的处理
一,自定义异常
例子:
<?php
namespace App\Exceptions;
use Exception;
class ApiException extends Exception
{
public function __construct($message = null, $code = 0)
{
parent::__construct($message, $code);
}
public function render()
{
$rs = [
'status'=>'failed',
'code'=>$this->code,
'time'=>date('Y-m-d H:i:s'),
'msg'=>$this->message."----in ApiException",
'data'=>(Object)[],
];
return response()->json($rs);
}
}
二,自定义异常的调用
try {
DB::beginTransaction();
// 此处是数据库的业务处理逻辑
DB::commit();
return ['code' => 0, 'data' => []];
} catch (Throwable $e) {
DB::rollBack();
report($e); //写到日志中
throw new ApiException('数据更新失败,请稍后再试', 500); //中断业务处理,抛出自定义异常
}
三,全局异常处理的设置
bootstrap/app.php
->withExceptions(function (Exceptions $exceptions) {
$exceptions->dontReport(ApiException::class); //自定义异常不写日志
$exceptions->respond(function (Response $response, Throwable $exception) {
//判断$exception的类型
if ($exception instanceof ApiException) {
//当前是自定义异常时,调用异常的render方法返回
return $exception->render();
} else { //处理其他异常的逻辑
$env = env('APP_ENV');
//本地和测试 环境时,打印文件和行数,生产环境只打印信息
if ($env == 'production') {
$msg = $exception->getMessage();
} else {
$msg = $exception->getMessage().' '.$exception->getFile().' '.$exception->getLine();
}
return response()->json(['status'=>'failed','code'=>500,'msg'=>$msg]);
}
});
})