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]);
            }

        });

    })

 

posted @ 2024-10-16 10:58  刘宏缔的架构森林  阅读(199)  评论(0编辑  收藏  举报