はじめに
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アプリケーションにおける例外処理をカスタマイズすることができます。