laravel-异常处理

laravel 异常抛出

在开发中错误处理是非常重要的,最重要是两点:第一,声明异常的错误代码和信息。第二,不同场景下抛出异常的有所不同,比如 api 中一般是前端 ajax 请求,那么抛出的异常应该是 json 形式,如果是开发模式下,页面中抛出普通异常,便于程序猿调错,在生产环境下,则统一将错误汇总放入一个错误页面进行渲染。

声明异常

就以一个用户模块来举例:

在 /config/exceptions.php 中声明抛出异常的信息和错误代码

<?php
return [
    'not_found_api' => ['message' => '接口未找到', 'code' => '404'],
    'not_found_page' => ['message' => '页面未找到', 'code' => '404'],

    'user' => [
        'already_logout' => ['message' => '您已处于登出状态,请重新登录', 'code' => '40005'],
        'permission_deny' => ['message' => '您无访问权限', 'code' => '40001'],
        'captcha_error' => ['message' => '短信验证码错误', 'code' => '40002'],
        'not_found' => ['message' => '该用户不存在', 'code' => '40003'],
        'not_admin' => ['message' => '该账号没有管理后台权限!', 'code' => '40004'],
    ]
];

在 /app/Exceptions/ 下的文件目录结构:
app/Exceptions
      BaseException.php
      User.php
      Handler.php

BaseException.php : 接受和处理异常,并传入父类的构造函数异常处理中

<?php

namespace App\Exceptions;

use JsonSerializable;
use Exception;

class BaseException extends Exception implements JsonSerializable{

    const EXCEPTION_CONFIG_PREFIX = 'exceptions.';

    public function __construct($config = '', $message = null, $code = null){
        $exception = config(static::EXCEPTION_CONFIG_PREFIX.$config);
        $code  = is_null($code)? $exception['code'] : $code;
        $message = is_null($message) ? $exception['message'] : $message;
        parent::__construct($message, $code);
    }

    public function jsonSerialize(){
        return [
            'errCode' => $this->getCode(),
            'message' => $this->getMessage()
        ];
    }

    public function setMessage($message){
        $this->message = $message;
    }

    public function setCode($code){
        $this->code = $code;
    }
}

User.php : 声明用户 User 模块中的异常

<?php

namespace App\Exceptions;

class User extends BaseException{
    const EXCEPTION_CONFIG_PREFIX = 'exceptions.user.';
}

Handler.php : 处理异常

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;
//区别是否 ajax 请求 api 而分别处理的 404 错误
use App\Exceptions\NotFoundApi as NotFoundApiException;
use App\Exceptions\NotFoundPage as NotFoundPageException;
//在此命名空间 /vendor/symfony/http-kernel/Exception 下有许多异常,可以参考一下
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

use App\Traits\Response as ResponseTrait;

class Handler extends ExceptionHandler
{
    use ResponseTrait;

    /**
     * A list of the exception types that should not be reported.
     *
     * @var array
     */
    protected $dontReport = [
        HttpException::class,
        ModelNotFoundException::class,
    ];

    /**
     * Report or log an exception.
     *
     * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
     *
     * @param  \Exception  $e
     * @return void
     */
    public function report(Exception $e)
    {
        return parent::report($e);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $e
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $e)
    {
        //如果是生产环境
        if (env('APP_DEGUB')) {
            $exceptions = [];
            $exceptions['code'] = $e->getCode();
            $exceptions['message'] = $e->getMessage();
            //上线时,需要对抛出的异常进行汇总交互至前端 view 中
            return response()->view("errors.exceptions", ['exceptions' => $exceptions]);
        }
        if ($e instanceof ModelNotFoundException) {
            $e = new NotFoundHttpException($e->getMessage(), $e);
        }

        /**
         * 调试环境下,不需要返回json格式的结果
         */
        if(!env('APP_NEED_JSON_RESPONSE')){
            return parent::render($request, $e);
        }

        if($request->ajax() || $request->wantsJson()){
            if($e instanceof NotFoundHttpException){
                $e = new NotFoundApiException;
            }

            return $this->jsonResponse(null, $e->getMessage(), $e->getCode());
        }else{
            if($e instanceof NotFoundHttpException){
                $e = new NotFoundPageException;
            }

            return parent::render($request, $e);
        }
    }
}

准备工作都做好后,抛异常就非常简单了 :

use App\Exceptions\User as UserException;

throw new UserException('captcha_error');
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值