Laravel - The Basics - Error Handling

前言

學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 Q&A 的方式記錄下來, 加速學習以及查詢。




Configuration

Laravel 中, 哪個設定會決定當遇到錯誤時, 是否印出 stack of trace information?

config/app.php 中的 APP_DEBUG option




The Exception Handler

Report Method

Laravel 中, 所有的 exceptions 都是由哪一個 class 所處理?

App\Exceptions\Handler

Laravel 中, 如果我要 log exceptions 或傳送到外部服務, 可以使用 哪一個 class哪一個 method
  • App\Exceptions\Handler class
  • report method
Laravel 中, 如果我想要客製化的 log 指定的 exception, CustomException, 在以下的 example 中, 我可以怎麼做?
  • Example:

    <?php
    public function report(Throwable $exception)
    {
    if (what should I put here?) {
    //
    }

    parent::report($exception);
    }
  • Answer:

    <?php
    public function report(Throwable $exception)
    {
    if ($exception instanceof CustomException) {
    //
    }

    parent::report($exception);
    }


Global Log Context

Laravel 預設會將目前的 user id 加到 exception 的 log message 當中, 如果我想要增加新的資訊到預設輸出, 我可以在 哪個 class哪個 method 定義這件事?
  • App\Exceptions\Handler class
  • context method
Laravel 預設會將目前的 user id 加到 exception 的 log message 當中, 如果我想要增加新的資訊到預設輸出, 假設是 ‘man’ => ‘ray’, 在以下的 example 中, 我可以怎麼做?
  • Example:

    <?php
    protected function context()
    {
    // what should I put here?
    }
  • Answer:

    <?php
    protected function context()
    {
    return array_merge(parent::context(), [
    'foo' => 'bar',
    ]);
    }


The Report Helper

Laravel 中, 當我 catch 到 error 時, 如果我想要繼續處理 request, 並且 report error, 在以下的 example 中, 我可以怎麼做?
  • Example:

    <?php
    public function isValid($value)
    {
    try {
    // Validate the value...
    } catch (Throwable $e) {
    // what should I put here?

    return false;
    }
    }
  • Answer:

    <?php
    public function isValid($value)
    {
    try {
    // Validate the value...
    } catch (Throwable $e) {
    report($e);

    return false;
    }
    }

The Report Helper

Laravel 中, 當我 catch 到 error 時, 如果我想要繼續處理 request, 並且 report error, 在以下的 example 中, 我該使用哪個 type hint?
  • Example:

    <?php
    public function isValid($value)
    {
    try {
    // Validate the value...
    } catch (what should I put here? $e) {
    report($e);

    return false;
    }
    }
  • Answer:

    <?php
    public function isValid($value)
    {
    try {
    // Validate the value...
    } catch (Throwable $e) {
    report($e);

    return false;
    }
    }


Ignoring Exceptions By Type

Laravel 中, 如果我想要指定特定的 exceptions, 這些 exceptions 我不想要記錄到 log file, 那我可以在 哪個 class哪個 property 來定義這些 exceptions?
  • App\Exceptions\Handler class
  • $dontReport property
Laravel 中, 解釋以下的 example
  • Example:

    <?php
    protected $dontReport = [
    \Illuminate\Auth\AuthenticationException::class,
    \Illuminate\Auth\Access\AuthorizationException::class,
    \Symfony\Component\HttpKernel\Exception\HttpException::class,
    \Illuminate\Database\Eloquent\ModelNotFoundException::class,
    \Illuminate\Validation\ValidationException::class,
    ];
  • Answer:
    定義你不想要記錄到 log file 的 exceptions


Render Method

Laravel 中, 當有錯誤時, 如果我想要客製化 response, 不採用預設的 Laravel response, 我可以使用 哪一個 class哪一個 method?
  • App\Exceptions\Handler class
  • render method
解釋以下的 Laravel example
  • Example:

    <?php
    public function render($request, Throwable $exception)
    {
    if ($exception instanceof CustomException) {
    return response()->view('errors.custom', [], 500);
    }

    return parent::render($request, $exception);
    }
  • Answer:

    <?php
    // 使用 render method
    public function render($request, Throwable $exception)
    {
    // 如果 exception 為指定的
    if ($exception instanceof CustomException) {
    // 做相對應的客製化 response
    return response()->view('errors.custom', [], 500);
    }

    // 若非指定 exception, 採用預設 response
    return parent::render($request, $exception);
    }

Reportable & Renderable Exceptions

Laravel 中, 如果我想要建立客製化的 exception, 可以在哪個資料夾內建立?

app/Exceptions

Laravel 中, 如果我不想要在 handler class 中用 type hint 的方式來 cache 指定的 exception, 取而代之的是我想要在該客製化 exception 中定義好 report 以及 render 的行為, 那我可以使用哪兩個 method?
  • report method
  • render method
解釋以下 Laravel example
  • Example:

    <?php

    namespace App\Exceptions;

    use Exception;

    class RenderException extends Exception
    {
    public function report()
    {
    //
    }

    public function render($request)
    {
    return response(...);
    }
    }
  • Answer:

    <?php

    namespace App\Exceptions;

    use Exception;

    // 使用客製化 exception, 並 extend Exeeption
    class RenderException extends Exception
    {
    // 可在 report 內定義該 exception 被 throw 時的行為, 即該 log exception 或是導向外部 service, 預設是 log
    public function report()
    {
    //
    }

    // 可在 render 內定義該 exception 被 throw 時的行為
    public function render($request)
    {
    return response(...);
    }
    }




HTTP Exceptions

Laravel 中, 如果我要立即的回傳一個 exception, 帶著我指定的 error code, 那我可以使用哪一個 global helper?

abort helper

Laravel 中, 如果我要立即的回傳一個 exception, 帶著我指定的 error code 403, 並帶著指定 response text Unauthorized action, 在以下的 example 中, 我可以怎麼做?
  • Example:

    <?php
    abort(what should I put here?);
  • Answer:

    <?php
    abort(403, 'Unauthorized action.');


Custom HTTP Error Pages

Laravel 中, 如果我想要客製化 HTTP Error pages, 可以將檔案至於哪個資料夾下?

resources/views/errors/

Laravel 中, 如果我想要客製化 HTTP Error pages, 假設我要客製化的 error code 為 404, 那在資料夾 resources/views/errors/ 中, 我的檔案名稱為?

404.blade.php

Laravel 中, 如果我想要在 view 中取出 $exception 的 message, 比如說我們使用 abort 定義了 response text, 那在以下的 example 中, 我可以怎麼做?
  • Example:

    <?php
    <h2>{{ what should I put here? }}</h2>
  • Answer:

    <?php
    <h2>{{ $exception->getMessage() }}</h2>
Laravel 中, 如果我想要使用 CLI publish 我自己的 error page templates, 我可以怎麼做?
php artisan vendor:publish --tag=laravel-errors
Laravel - Digging Deeper - Broadcasting Laravel - The Basics - URL Generation

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×