异常指的是在程序运行过程中发生的异常事件,通常是由外部问题所导致的。

异常处理是程序开发中经常遇到的任务,如何优雅地处理异常,从一定程度上反映了你的程序是否足够严谨。

在本次的项目开发中,我们将异常大致分为 用户异常 和 系统异常,接下来我们将分别对其讲解和代码实现。

  1. 用户错误行为触发的异常

比如访问一个被下架的商品时触发的异常,对于此类异常我们需要把触发异常的原因告知用户。

我们暂时把这类异常命名为 InvalidRequestException,可以通过 make:exception 命令来创建:

php artisan make:exception InvalidRequestException

新创建的异常文件保存在 app/Exceptions/ 目录下:

app/Exceptions/InvalidRequestException.php

<?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]);
    }
}

现在来创建这个错误页面:
`
@extends('layouts.app')
@section('title', '错误')

@section('content')
<div class="card">

<div class="card-header">错误</div>
<div class="card-body text-center">
    <h1>{{ $msg }}</h1>
    <a class="btn btn-primary" href="{{ route('root') }}">返回首页</a>
</div>

</div>
@endsection
`

屏蔽指定异常写日志可以在app/Exceptions/Handler.php中注册

protected $dontReport = [
       InvalidRequestException::class,
   ];

当一个异常被触发时,Laravel 会去检查这个异常的类型是否在 $dontReport 属性中定义了,如果有则不会打印到日志文件中。
调用异常方法

use App\Exceptions\InvalidRequestException;

 ....
   throw new InvalidRequestException('抛出错误提示');
....