laravel-异常处理

Myth丶恋晨 2022-07-13 00:47 286阅读 0赞

laravel 异常抛出

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

声明异常

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

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

  1. <?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 : 接受和处理异常,并传入父类的构造函数异常处理中

  1. <?php
  2. namespace App\Exceptions;
  3. use JsonSerializable;
  4. use Exception;
  5. class BaseException extends Exception implements JsonSerializable{
  6. const EXCEPTION_CONFIG_PREFIX = 'exceptions.';
  7. public function __construct($config = '', $message = null, $code = null){
  8. $exception = config(static::EXCEPTION_CONFIG_PREFIX.$config);
  9. $code = is_null($code)? $exception['code'] : $code;
  10. $message = is_null($message) ? $exception['message'] : $message;
  11. parent::__construct($message, $code);
  12. }
  13. public function jsonSerialize(){
  14. return [
  15. 'errCode' => $this->getCode(),
  16. 'message' => $this->getMessage()
  17. ];
  18. }
  19. public function setMessage($message){
  20. $this->message = $message;
  21. }
  22. public function setCode($code){
  23. $this->code = $code;
  24. }
  25. }

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

  1. <?php
  2. namespace App\Exceptions;
  3. class User extends BaseException{
  4. const EXCEPTION_CONFIG_PREFIX = 'exceptions.user.';
  5. }

Handler.php : 处理异常

  1. <?php
  2. namespace App\Exceptions;
  3. use Exception;
  4. use Illuminate\Database\Eloquent\ModelNotFoundException;
  5. use Symfony\Component\HttpKernel\Exception\HttpException;
  6. //区别是否 ajax 请求 api 而分别处理的 404 错误
  7. use App\Exceptions\NotFoundApi as NotFoundApiException;
  8. use App\Exceptions\NotFoundPage as NotFoundPageException;
  9. //在此命名空间 /vendor/symfony/http-kernel/Exception 下有许多异常,可以参考一下
  10. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  11. use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
  12. use App\Traits\Response as ResponseTrait;
  13. class Handler extends ExceptionHandler
  14. {
  15. use ResponseTrait;
  16. /** * A list of the exception types that should not be reported. * * @var array */
  17. protected $dontReport = [
  18. HttpException::class,
  19. ModelNotFoundException::class,
  20. ];
  21. /** * Report or log an exception. * * This is a great spot to send exceptions to Sentry, Bugsnag, etc. * * @param \Exception $e * @return void */
  22. public function report(Exception $e)
  23. {
  24. return parent::report($e);
  25. }
  26. /** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Illuminate\Http\Response */
  27. public function render($request, Exception $e)
  28. {
  29. //如果是生产环境
  30. if (env('APP_DEGUB')) {
  31. $exceptions = [];
  32. $exceptions['code'] = $e->getCode();
  33. $exceptions['message'] = $e->getMessage();
  34. //上线时,需要对抛出的异常进行汇总交互至前端 view 中
  35. return response()->view("errors.exceptions", ['exceptions' => $exceptions]);
  36. }
  37. if ($e instanceof ModelNotFoundException) {
  38. $e = new NotFoundHttpException($e->getMessage(), $e);
  39. }
  40. /** * 调试环境下,不需要返回json格式的结果 */
  41. if(!env('APP_NEED_JSON_RESPONSE')){
  42. return parent::render($request, $e);
  43. }
  44. if($request->ajax() || $request->wantsJson()){
  45. if($e instanceof NotFoundHttpException){
  46. $e = new NotFoundApiException;
  47. }
  48. return $this->jsonResponse(null, $e->getMessage(), $e->getCode());
  49. }else{
  50. if($e instanceof NotFoundHttpException){
  51. $e = new NotFoundPageException;
  52. }
  53. return parent::render($request, $e);
  54. }
  55. }
  56. }

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

  1. use App\Exceptions\User as UserException;
  2. throw new UserException('captcha_error');

发表评论

表情:
评论列表 (有 0 条评论,286人围观)

还没有评论,来说两句吧...

相关阅读

    相关 laravel-异常处理

    laravel 异常抛出 在开发中错误处理是非常重要的,最重要是两点:第一,声明异常的错误代码和信息。第二,不同场景下抛出异常的有所不同,比如 api 中一般是前端 aj

    相关 laravel事务控制处理

           在我们的业务处理中,有时候会遇到多个SQL语句的操作,并且他们是分开执行的,有时候他们是存在互相关联的,比如A表新添了一条记录,B表要对该记录进行关联,如果我们不