#### 创建异常类
创建的异常类在app/Exceptions/目录下
~~~
php artisan make:exception xxxException
~~~
#### 定义异常类
Laravel 5.5 之后支持在异常类中定义 render() 方法,该异常被触发时系统会调用 render() 方法来输出,我们在 render() 里判断如果是 AJAX 请求则返回 JSON 格式的数据,否则就返回一个错误页面。
~~~
<?php
namespace App\Exceptions;
use Exception;
use Illuminate\Http\Request;
class InvalidRequestException extends Exception
{
public function __construct(string $message = "", int $code = 400)
{
parent::__construct($message, $code);
}
public function render(Request $request)
{
if ($request->expectsJson()) {
// json() 方法第二个参数就是 Http 返回码
return response()->json(['msg' => $this->message], $this->code);
}
return view('pages.error', ['msg' => $this->message]);
}
}
~~~
#### 屏蔽异常类进入日志
当异常触发时 Laravel 默认会把异常的信息和调用栈打印到日志里.而此类异常并不是因为我们系统本身的问题导致的,不会影响我们系统的运行,如果大量此类日志打印到日志文件里反而会影响我们去分析真正有问题的异常,因此需要屏蔽这个行为。
app/Exceptions/Handler.php
~~~
protected $dontReport = [
InvalidRequestException::class,
];
~~~
当一个异常被触发时,Laravel 会去检查这个异常的类型是否在 $dontReport 属性中定义了,如果有则不会打印到日志文件中。