Laravel框架中,App\Exceptions\Hander.php 为异常捕获的统一处理地方,可以在这里自定义你想处理的任何错误信息,并友好的返回自定义错误信息。主要涉及到2个方法,report 和 render。如下图所示,render方法里为自定义捕获的错误类型,返回数据以及状态码可根据自己爱好自定义,下面为常见的一些错误类型捕获:
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Illuminate\Database\QueryException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class Handler extends ExceptionHandler
{
/**
* The list of the inputs that are never flashed to the session on validation exceptions.
*
* @var array<int, string>
*/
protected $dontFlash = [
'current_password',
'password',
'password_confirmation',
];
/**
* Register the exception handling callbacks for the application.
*/
public function register(): void
{
$this->reportable(function (Throwable $e) {
//
});
}
public function report(Throwable $exception)
{
parent::report($exception);
}
public function render($request, Throwable $exception){
$code = 0;
$msg = '';
if ($exception instanceof HttpException) {
$code = 500;
$msg = 'http请求错误,请稍后重试';
}else if ($exception instanceof NotFoundHttpException) {
$code = 404;
$msg = '访问的地址不存在';
}else if ($exception instanceof MethodNotAllowedHttpException) {
$code = 405;
$msg = 'http请求方式不被允许,请检查后重试';
}else if ($exception instanceof QueryException) {
$code = 500;
$msg = '数据处理错误,请稍后重试';
}else if ($exception instanceof ModelNotFoundException) {
$code = 404;
$msg = '模型未找到,请稍后重试';
} else if ($exception instanceof \ReflectionException) {
$code = 500;
$msg = '项目反射类/方法/函数错误,请稍后重试';
}else if ($exception instanceof \ErrorException) {
$code = 500;
$msg = '发生error错误,请稍后重试';
}else if ($exception instanceof \Runtimeexception){
$code = 500;
$msg = '程序运行出错,请稍后重试';
}
if ($code > 0) {
Log::info('错误:',['code'=>$code,'msg'=>$msg,'data'=>$exception->getMessage()]);
return response()->json(['code'=>$code,'message'=>$msg], $code);
}
return parent::render($request, $exception);
}
}