1
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?

概要

例外についてちゃんと理解できていなかったのでまとめる。

例外とスコープ

自分は今までDBのトランザクション処理等でTryCatchを多様してきた。
特に考えず、呪文のように下記のような書き方をしていた。

try {
    DB::beginTransaction();

    // DB更新処理

    DB::commit();
} catch (\Throwable $e) {
    DB::rollBack();
    throw $e;
}

まずこれがどういうことなのかを簡単にまとめる。
上記の処理はまずtryブロックの中が実行される。tryブロックの中の処理を実行中に何かしらの例外が発生したとする。
投げられた例外はどんな種類だろうと$eに入った状態でcatchブロックの中が実行される。
例外が発生したのでDBの更新処理はロールバックして処理の前の状態に戻す。
その後、throw $eで意図的に再度受け取った例外を発生させて、App\Exceptions\Handlerクラスで例外のハンドリングが行われる。

TryCatchはローカルスコープと呼ばれる。ローカルスコープ内で例外を受け取った場合、ローカルスコープ内より外には例外発生がわからない。そのためcatchブロックの中でわざわざもう一度throw $eをして「例外を発生させてlaravelの処理を止める」必要がある。
上記の「例外を発生させてlaravelの処理を止める」はグローバルスコープで行われる。これはApp\Exceptions\Handlerで例外がハンドリングされ、結果laravelが例外を出して処理が停止してくれる。

TryCatchが設定されている場合、例外はCatchブロックの中が実行されるだけでthrow $eが書かれてなかったら処理は止まらないはず。
逆にTryCatchが設定されていない場所で例外が発生するとApp\Exceptions\Handlerで例外がハンドリングされlaravelの処理が止まる。

1
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
1
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?