Laravel Exceptionの作り方

# 今回はLaravelのExceptionの作り方について記述していきます。


LaravelではExceptionsそうがあり、ここでは例外処理に関するクラスを格納するためのディレクトリーです。


## 1 Exceptionファイルを作成
Exceptionファイル作成コマンド

```
php artisan make:exception TestException
```

これでApp/Exceptions/TestExceptionが作成されました。


## 2 Exceptionファイル処理を記述
```
<?php

namespace App\Exceptions;

use Exception;

class TestException extends Exception
{
  //ここに記述していきます↓
 public function getError()
    {
        return 'errorだよ';
    }
    
}
```

## 3 例外ファイルを呼び出す
```
Route::get('/', function () {
    try {
        //例外を投げる
        throw new TestException();
       //$eにTestExceptionインスタンスを作成して代入する
    } catch (TestException $e) {
        $e->getErrorErr();
         //TestExceptionクラスのgetError()メゾット（独自で作ったメゾット）
    }
    return view('owner.welcome');
});
```



Handler.php
```
<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;

class Handler extends ExceptionHandler
{
    /**
     * A list of exception types with their corresponding custom log levels.
     *
     * @var array<class-string<\Throwable>, \Psr\Log\LogLevel::*>
     */
   //このプロパティは例外の種類に対応するカスタムログレベルのリストを保持する配列
    protected $levels = [
       // PDOException::class => LogLevel::CRITICAL,
    ];

    /**
     * A list of the exception types that are not reported.
     *
     * @var array<int, class-string<\Throwable>>
     */
    //報告しない例外クラスを指定
      //このプロパティは　報告しない例外のタイプを保持する配列です。
    protected $dontReport = [
        //$dontReportプロパティ
        InvalidOrderException::class,
    ];

    /**
     * A 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.
     *
     * @return void
     */
      //アプリケーションの例外処理コールバックを登録するために使用されます。Throwable型の例外を受け取るクロージャを引数に取ります.通常、
        //このメゾット内で例外の報告やログ出力などの処理を定義します。
    public function register()
    {
        $this->reportable(function (Throwable $e) {
            //
        });
    }
    /**
     * 例外をHTTPレスポンスへレンダリング
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */

    //render($request, Throwable $e)メソッドは、発生した例外をHTTPレスポンスにレンダリングするための処理を行います。

    public function render($request, Throwable $e)
    {
        return response(/* ... */);
    }
}

```

次はHandle.phpを呼び出してエラーがあった場合にログインページにリダイレクトされる処理をしたいと思います。

## Handle.phpのrenderメソッドとは
renderメソッドは、発生した例外をHTTPレスポンスにレンダリングするための処理を行います。
具体的には、このメソッドでは以下のような処理を行うことが一般的です。

・例外に基づいて適切なHTTPレスポンスを作成する。
 ・エラーページの表示やJSONレスポンスの返却など、アプリケーションのエラーレスポンスの形式に応じた処理を行う。
　
### ・具体例

1 エラーページの表示: 例外に基づいてエラーページを表示するためのビューをレンダリングし、それをHTTPレスポンスとして返す。
２　JSONレスポンスの返却: 例外がAPIリクエストの処理中に発生した場合など、JSON形式のエラーレスポンスを返す。
３　リダイレクト: 特定の例外が発生した場合、指定されたリダイレクト先にリダイレクトする。
 カスタム処理: 特定の例外に対して独自の処理を行う。例えば、ログの記録やメールの送信など。具体的な処理はアプリケーションの要件や開発者の設計によって異なります。render()メソッドをオーバーライドすることで、アプリケーション固有のエラーハンドリングロジックを実装できます。


それではHandle.phpを変更していきます。

```
 public function render($request, Throwable $e)
    {

        //renderメゾットの引数にrequestとThrowable $e(例外インスタンス)を指定
        if ($e instanceof TestException) {
            //$e(例外インスタンス)がTestExceptionだったら
            return redirect(route('owner.login'));
            //ログインページにリダイレクトさせる
        }
        // return response(/* ... */);
        //それ以外の場合はデフォルトのエラー処理をする
        return parent::render($request, $e);
    }
```

こちらでコントローラーでわざと例外を出してrenderメゾットの処理をさせます。

```
public function index()
    {
        try {
             //例外があった場合
            throw new Exception();
        } catch (Exception $e) {
            //TestExceptionファイルの例外処理をする
            throw TestException();
        }
    }
```
これでindex()処理がされた場合に自動でログインページにリダイレクトされます。
以上です。ありがとうございました。