カテゴリ: Laravel 更新日: 2026/03/11

Laravelのエラーハンドリング完全ガイド!try-catchとHandlerの役割を初心者向けに解説

Laravelのエラーハンドリングの基本!try-catchとHandlerの役割
Laravelのエラーハンドリングの基本!try-catchとHandlerの役割

先生と生徒の会話形式で理解しよう

生徒

「Laravelでエラーが起きたとき、どうやって対処すればいいんですか?」

先生

「Laravelには、エラーをうまく処理するための仕組みが最初から用意されています。その中心となるのが、try-catchという構文と、Handlerというクラスです。」

生徒

「try-catchってなんですか?難しそうで怖いです。」

先生

「全然怖くないですよ!料理で失敗したときの対処法みたいなものです。一緒に見ていきましょう!」

1. エラーハンドリングとは何か

1. エラーハンドリングとは何か
1. エラーハンドリングとは何か

プログラムを動かしていると、必ずどこかでエラー(エラーとは、プログラムが予期しない状態になって止まってしまうこと)が起きます。たとえば、データベースに接続できなかった、存在しないファイルを読もうとした、ユーザーが変な値を入力した、などが代表的な例です。

こういったエラーが起きたとき、何も対策していなければプログラムはそこで止まってしまい、ユーザーには意味不明な画面が表示されてしまいます。それを防ぐのがエラーハンドリング(エラーハンドリングとは、エラーをうまく受け取って、適切に対処する仕組みのこと)です。

Laravelでは、このエラーハンドリングの仕組みがとても充実しており、初心者でも安心してエラー処理を書くことができます。Laravelの例外処理、デバッグ、エラー対応を理解することは、Webアプリケーション開発の基礎として非常に重要です。

2. 例外とは何か(Exceptionの意味)

2. 例外とは何か(Exceptionの意味)
2. 例外とは何か(Exceptionの意味)

エラーハンドリングを学ぶ前に、まず例外(Exception)という言葉を理解しましょう。例外とは、プログラムが通常の流れで処理できない特別な状況のことです。

たとえば、料理のレシピに「卵を2個割る」と書いてあるのに、卵がゼロ個しかないとします。このとき、レシピ通りに進めることができませんよね。これがプログラムでいう「例外」です。

Laravelでも、処理できない状況になると例外オブジェクトというものが「投げられます(throwされます)」。この投げられた例外を受け取って、どう対処するかを書くのがエラーハンドリングの基本です。PHPの例外クラス、Laravelの例外の種類を理解することで、より細かい対処ができるようになります。

3. try-catchの基本的な書き方

3. try-catchの基本的な書き方
3. try-catchの基本的な書き方

try-catchは、エラーが起きそうな処理をtryブロックで囲み、もしエラーが起きたらcatchブロックで受け取る、という構造です。まるで「やってみて、ダメだったらこうする」という考え方です。

基本的な書き方は次のようになります。


try {
    // エラーが起きるかもしれない処理
    $result = 10 / 0; // ゼロで割るとエラーになる可能性がある
} catch (Exception $e) {
    // エラーが起きたときの処理
    echo 'エラーが発生しました: ' . $e->getMessage();
}

上のコードでは、tryの中でエラーが起きると、catchブロックに処理が移ります。$eは例外オブジェクトで、getMessage()メソッドを使うとエラーのメッセージを取得できます。Laravelのtry-catch、PHPの例外処理の基本として覚えておきましょう。

4. Laravelでのtry-catchの実践例

4. Laravelでのtry-catchの実践例
4. Laravelでのtry-catchの実践例

Laravelのコントローラーの中で、データベース操作など失敗する可能性のある処理をtry-catchで囲む書き方を見てみましょう。


use App\Models\User;
use Exception;

public function show($id)
{
    try {
        $user = User::findOrFail($id);
        return view('user.show', ['user' => $user]);
    } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
        return redirect('/')->with('error', 'ユーザーが見つかりませんでした');
    } catch (Exception $e) {
        return redirect('/')->with('error', 'エラーが発生しました');
    }
}

findOrFail()は、指定したIDのレコードが見つからなかった場合にModelNotFoundException(モデルが見つからない例外)を投げます。このようにcatchブロックを複数書くことで、エラーの種類に応じて処理を分けることができます。Laravelのコントローラーでのエラー処理、findOrFailの使い方として非常によく使われるパターンです。

5. finallyブロックの役割

5. finallyブロックの役割
5. finallyブロックの役割

try-catchには、もう一つfinallyというブロックを追加できます。finallyブロックは、エラーが起きてもおきなくても、必ず最後に実行される処理を書く場所です。

たとえば、ファイルを開いて処理する場合、エラーが起きてもファイルを閉じる処理は必ず行いたいですよね。そういったときにfinallyを使います。


try {
    // データベース接続など
    \DB::beginTransaction();
    // 何らかの処理
    \DB::commit();
} catch (Exception $e) {
    \DB::rollBack();
    \Log::error('処理中にエラーが発生: ' . $e->getMessage());
} finally {
    // エラーの有無に関わらず必ず実行される
    \Log::info('処理が終了しました');
}

上のコードでは、データベースのトランザクション(トランザクションとは、複数のデータ操作をひとまとめにして、全部成功するか全部失敗するかを保証する仕組み)を使っています。エラーが起きたらrollBack(元に戻す)し、最後は必ずログにメッセージを残しています。

6. LaravelのHandlerクラスとは

6. LaravelのHandlerクラスとは
6. LaravelのHandlerクラスとは

Laravelには、アプリケーション全体のエラーを一元管理するHandlerクラスがあります。場所はapp/Exceptions/Handler.phpです。このファイルを編集することで、特定のエラーが起きたときにどんな動作をするか、まとめて設定できます。

Handlerクラスは、コントローラーの外で起きたエラーや、try-catchで捕まえられなかった例外を最終的に受け取る役割を担っています。いわばエラーの最後の受け皿です。

Laravel 11からHandlerクラスの構造が変わり、bootstrap/app.phpの中でエラー処理の設定をするようになりました。以前のバージョン(Laravel 8〜10)ではHandler.phpに直接書いていましたが、基本的な考え方は同じです。


// Laravel 10 以前の app/Exceptions/Handler.php の例
public function render($request, Throwable $exception)
{
    if ($exception instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
        return response()->view('errors.404', [], 404);
    }

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

このようにrender()メソッドの中で、例外の種類に応じて返すレスポンス(レスポンスとは、サーバーからブラウザに返す応答のこと)を変えることができます。LaravelのHandlerクラス、例外のカスタマイズ、404エラーページの作り方として非常に重要な知識です。

7. エラーログの活用方法

7. エラーログの活用方法
7. エラーログの活用方法

エラーが起きたとき、その内容を記録しておくのがログ(ログとは、プログラムの動作記録のこと)です。Laravelでは\Logファサードを使って、簡単にログを残すことができます。

ログのレベルには、情報(info)、警告(warning)、エラー(error)などがあります。エラーの深刻度に応じて使い分けましょう。ログファイルはstorage/logs/laravel.logに保存されます。


use Illuminate\Support\Facades\Log;

try {
    // 処理
    $value = someRiskyFunction();
    Log::info('処理が正常に完了しました', ['value' => $value]);
} catch (Exception $e) {
    Log::error('エラーが発生しました', [
        'message' => $e->getMessage(),
        'file'    => $e->getFile(),
        'line'    => $e->getLine(),
    ]);
    return response()->json(['error' => '処理に失敗しました'], 500);
}

getFile()はエラーが発生したファイルのパスを、getLine()は発生した行番号を返します。これらをログに残しておくことで、後でどこでエラーが起きたか素早く特定できます。Laravelのログ機能、デバッグの方法、エラー調査のやり方として実際の開発でよく使うテクニックです。

8. 開発環境と本番環境でのエラー表示の違い

8. 開発環境と本番環境でのエラー表示の違い
8. 開発環境と本番環境でのエラー表示の違い

Laravelでは、.envファイルのAPP_ENVAPP_DEBUGの設定によって、エラーの表示方法が変わります。

開発環境(APP_DEBUG=true)では、エラーが起きると詳細なデバッグ画面(スタックトレースやエラーの発生場所など)が表示されます。開発中は原因を素早く特定できるので非常に便利です。

本番環境(APP_DEBUG=false)では、詳細なエラー情報は表示されず、シンプルなエラーページだけが表示されます。これはセキュリティ上とても重要です。なぜなら、エラー情報にはデータベースの構造やファイルパスなど、外部に見せてはいけない情報が含まれることがあるからです。

本番環境で表示するエラーページは、resources/views/errors/フォルダの中に404.blade.php500.blade.phpなどのファイルを作ることでカスタマイズできます。Laravelのエラーページのカスタマイズ、APP_DEBUGの設定、本番環境のエラー対応として必ず押さえておきたいポイントです。

カテゴリの一覧へ
新着記事
New1
Symfony
Symfonyとは?PHPの堅牢なフレームワークの特徴と活用シーン
New2
Laravel
Laravelのルーティングの基本構文と書き方をやさしく解説!初心者でも理解できるWebルートの仕組み
New3
Laravel
LaravelでAPI用のJSONエラーレスポンスを整形する方法!初心者向け完全ガイド
New4
CodeIgniter
CodeIgniterでカスタム例外クラスを作成する方法!初心者向けエラーハンドリング徹底解説
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelでモデルを作成する方法をやさしく解説!php artisan make:model入門
No.2
Java&Spring記事人気No2
Laravel
Laravelでルーティングを設定する方法!web.phpと基本ルートの書き方を初心者向けに徹底解説
No.3
Java&Spring記事人気No3
Laravel
Laravelでセッションを扱う方法!保存方法と利用例を解説
No.4
Java&Spring記事人気No4
Laravel
Laravelで特定のSeederだけ実行する方法!db:seed --class=で必要なデータだけ登録
No.5
Java&Spring記事人気No5
Laravel
Laravelの認証ミドルウェアauthとguestを徹底解説!初心者でもわかるルート制御ガイド
No.6
Java&Spring記事人気No6
Laravel
Laravelでモデルからデータを取得・保存・更新・削除する方法を完全ガイド!初心者でもわかるEloquent ORM入門
No.7
Java&Spring記事人気No7
Laravel
Laravelのuniqueバリデーションを使ったユニーク制約の設定方法
No.8
Java&Spring記事人気No8
Symfony
Symfonyでフォームデータを受け取り処理する方法を完全解説!初心者でも理解できる入門ガイド