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');
还没有评论,来说两句吧...