【Laravel8】例外処理を作成してみる ~Exceptionの作成方法~

はい、今回は例外処理について作成してみます。
今まであんまり触ってきていなかったのですが、今回触る機会があったのでちょっと一つまとめていきます!

正直try catchとかあんまり理解せんとおったんですよね…

なので改めて!

基本的な例外の呼び出し方

try catchの使い方

何か例外処理が起きそうな場所があればそこをtry catch文を使います!

try catchの使い方は以下をチェックしてみてください。

$reigaisyori = true
try {
  if($reigaisyori){
    throw new Exception('例外処理が走りました');
  }
} catch (\Exception $e) {
  info($e->getMessage());
}Code language: PHP (php)

基本的にtryの中に処理を書いて、例外の処理がありそうなところがあれば↑みたいな感じで例外処理を返すようにしますね

ちなみに今回はstorage/logs/laravel-yyyy-mm-dd.logに出力されている想定してます!

これが基本的な呼び出しです!

Exceptionの引数がcatchの中にある$eでこのエラーメッセージはgetMessage()をする必要があります。もし$eだけを入れてinfo($e) にすると、エラーメッセージ以外も取得しちゃうんです。↓みたいな感じで

[2022-08-23 20:38:57] local.INFO: Exception: 例外処理が走りました in /var/www/html/app/Http/Controllers/..........
Stack trace:
#0 /var/www/html/vendor/.......
#1 /var/www/html/vendor/.......
#2 /var/www/html/vendor/.......
#3 /var/www/html/vendor/.......
.....
.....
.....Code language: PHP (php)

ただ、info($e->getMessage()) にすることで、以下のようなログが出力されるようになります!

[2022-08-23 20:38:57] local.INFO: 例外処理が走りましたCode language: CSS (css)

ということでgetMessage()をつけることで解決ができますね!

DBのトランザクションにも使える

Laravelだと以下のようにして、データベースのトランザクションに利用できますね

// トランザクション処理開始
DB:beginTransaction();
try {
  
  // 例外処理チェック
  if($reigaijouken){
    throw new Exception('例外処理が走りました'); // エラーメッセージを投げる
  }

  $testService->create(); // 何かcreate処理をするのを想定(適当なので許して...)
  DB::commit(); // 問題なかったからコミット
} catch (\Exception $e) {
  DB::rollback(); // 問題があったからロールバック
  info($e->getMessage()); // どんなエラーが走ったかログに
}Code language: PHP (php)

はい、こんな感じで例外処理が走ったときにはロールバックして、問題なかったらコミットするみたいな感じで

トランザクションの使い方とかその辺りは今回は説明しないので、以下で確認してみてください!

例外処理をオレオレで作成してみる

では次にこのExceptionを自作してみます!

エラーメッセージは固定にする

まずExceptionクラスを作成します

php artisan make:exception TestException ←コマンドで作成できます

app/Exceptions/TestException.phpが作成されるので記述していきますね

っとその前にPHPでのExceptionの書き方というのは確認しておいてください!

class TestException extends Exception
{
  protected $message = '例外処理が走りました。' // 公式がprotectedにしているので遵守
}Code language: PHP (php)

これでException側の記述はOK

そしてExceptionをcontrollerとか何処かから呼び出してみましょうか

$reigaisyori = true
try {
  if($reigaisyori){
    throw new TestException();
  }
} catch (\Exception $e) {
  info($e->getMessage());
}Code language: PHP (php)

そう、こうすると先ほどエラーのメッセージは引数に入れていたけどその必要もないんです!

TestExceptionクラスで定義した$messageがログに出力されるようになります!

メッセージをExceptionクラスで作成

ではExceptionクラスでメッセージを動的に作成するにはどうしたら良いのでしょうか?

<?php

namespace App\Exceptions;

use Exception;

class TestException extends Exception
{

  protected $message;

  public function __construct(array $user)
  {
    $message = [
      'Error Message: 以下のユーザーに問題がありました。',
      "{$request => 'name'}",
      "{$request => 'email'}",
    ];

    $this->message = implode("\n", $message);
  }
}Code language: HTML, XML (xml)

implodeを使って配列に入っているmessageを改行するように

ではcontrollerでの処理を書いてみましょう!(引数を入れるだけですが)

$reigaisyori = true
$user = array('name' => '山田', 'email' => 'test@test.com')
try {
  if($reigaisyori){
    throw new TestException($user);
  }
} catch (\Exception $e) {
  info($e->getMessage());
}Code language: PHP (php)

ほい!こうするとログが出力されます!

ログの内容は、

[2022-08-23 20:38:57] local.INFO: Error Message: 以下のユーザーに問題がありました。
山田
test@test.com
Code language: CSS (css)

多分こんな感じに出力されるはずです!

まとめ

以上です!例外処理とかログに出力するのって開発中はあまり意識できないかもですが、運用のときになると重要になるかと思うので大切に!

今回は他にも以下の技術記事も参考に作成しました!

あんまり触ったことないところは、個人の技術ブログとか確認してフワッと理解して公式に飛ぶのが良いですね!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA