0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelで例外処理のカスタマイズを行う方法について

Last updated at Posted at 2024-07-07

はじめに

Laravelを使ってアプリケーションを作る時に、例外エラーが起きたときのハンドリングを設定することがありました。
そのときに例外をthrowするとどういうルートで、どこでエラーをキャッチするのかなどを調べたので、この記事にまとめます。

例外処理をthrowする記述

$res_data = [
'code' => ApiConst::STATUS_CODE_VALIDATE_ERROR,
'messages' => $errors,
];

throw new HttpResponseException(response()->json($res_data, ApiConst::HTTP_CODE_200));

throwしたデータはどこに投げられるのか

HttpResponseExceptionをthrowすると、例外がLaravelの例外ハンドラ(App\Exceptions\Handler)に渡されます。具体的には、renderメソッドでキャッチされ、その内容がレスポンスとして返されます。

例外ハンドラ(Handler)での処理

public function render($request, Throwable $exception)
{
    if ($exception instanceof HttpResponseException) {
        return $exception->getResponse();
    }

    // その他の例外処理...

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

例外がthrowする場所

throwされた場所:

上記のHttpResponseExceptionがthrowされる場所(例えば、コントローラーやサービスクラス内)。

例外ハンドラ:

HttpResponseExceptionは、Handlerクラスのrenderメソッドでキャッチされます。このメソッドは、throwされた例外に基づいてレスポンスを生成します。

例外処理にカスタムを入れたい時

カスタム例外クラスを作成します。app/Exceptionsディレクトリに新しいクラスファイルを作成します。

<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Illuminate\Support\Facades\Log;

class Handler extends ExceptionHandler
{
    protected $dontFlash = [
        'current_password',
        'password',
        'password_confirmation',
    ];

    public function render($request, Throwable $exception)
    {
        if ($exception instanceof CustomException) {
            $res_data = [
                'code' => $exception->getCustomCode(),
                'message' => $exception->getMessage(),
            ];
            return response()->json($res_data, $exception->getCustomCode());
        }

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

    public function report(Throwable $exception)
    {
        if ($exception instanceof CustomException) {
            Log::error('カスタム例外発生: ', [
                'message' => $exception->getMessage(),
                'code' => $exception->getCustomCode(),
            ]);
            return;
        }

        parent::report($exception);
    }
}

まとめ

カスタム例外クラスの作成:app/Exceptionsディレクトリに新しい例外クラスを作成し、必要なプロパティとメソッドを定義します。

カスタム例外のthrow:アプリケーション内で適切な場所でカスタム例外をthrowします。

例外ハンドラのカスタム化:App\Exceptions\Handlerクラスのrenderメソッドとreportメソッドをカスタムして、カスタム例外を適切に処理します。

これらのステップを踏むことで、Laravelアプリケーションにおける例外処理をカスタマイズすることができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?