Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPのエラーを理解して適切なエラーハンドリングを学ぼう

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 PHPのエラーを理解して適切なエラーハンドリングを学ぼう

Avatar for namizatork

namizatork

April 04, 2022
Tweet

More Decks by namizatork

Other Decks in Programming

Transcript

  1. Bengo4.com, Inc. • 一般市民と弁護士を結びつ け、お悩み解決を目指す • 2005年サービス開始 • 利用者数 約1,000万人/

    月 • 累計法律相談数 約100万件 3 弁護士ドットコム というサービス https://www.bengo4.com
  2. Bengo4.com, Inc. 弁護士ドットコム Creators’ Blog https://creators.bengo4.com 最新の記事 postcss-preset-envで少し未来のCSSを予習す る デザイナーに優しい

    HTMLテンプレートの開発方 針をボトムアップで作った話 サービス運用10年以上の重み、弁護士ドットコム のユニットテスト速度改善 弁護士ドットコムサービスのビジネスと共にみるマ イクロサービスの進化 4
  3. Bengo4.com, Inc. PHPのエラー • PHPのエラーは大きく分類して、致命的なエラー と 警告・注意 が存在する ◦ 致命的なエラー

    ▪ 現在の処理を中断する、はよ直せ(怒り) ◦ 警告・注意 ▪ 現在の処理は中断しないけど、直した方がいいよ(ハナホジ) 11
  4. Bengo4.com, Inc. PHPの致命的なエラー / 警告・注意 を一部抜粋 • 致命的なエラー ◦ Fatal

    error(存在しない関数を呼び出すなどで発生) ◦ Parse error(PHPの文法で間違いがあった時などで発生) • 警告・注意 ◦ Warning(存在しないファイルを呼び出した時などで発生) ◦ Notice(定義されていない変数を使用した時などで発生) 12
  5. Bengo4.com, Inc. PHPのエラーハンドリング 5系から導入された try - catch で記述する。 例外が発生し得る箇所を try

    {} で囲み、例外が発生した時点で後続する処理は中断 され catch {} で受け取り、例外が発生した時の対応(ハンドリング)を行う。 例外を明示的に(ほとんどはこのケースだと思うが)発生させたい場合は、 該当する箇所で throw を用いる。 16
  6. Bengo4.com, Inc. PHPの例外(Exception) 5系までは、全ての致命的エラーはエラーハンドリングがで きず処理がそこで中断されてしまいます。 しかし、7系からは Throwable インターフェースが実装さ れ、それを継承した Exception

    と Error が導入されまし た。そのおかげで致命的エラーの多くが Error をスローす るようになり、捕捉が可能になりました。 右の図(by @ngyuki)は例外の継承関係を図にしたもの です。 20
  7. Bengo4.com, Inc. 例外を握り潰さない 33 せっかく例外を throw しても catch句 で何もしなければエラーを無視してるも同然です。 catch句

    ではロギングの他にエラーの発生を呼び出し元に伝える、後続処理を行わないために return するなど、要件に応じた対応をしましょう。
  8. Bengo4.com, Inc. エラーハンドリングのスコープは小さく 34 様々な例外を全部一つの try {} の中におさめて、catch は全て Exception

    で拾ってしまっている try {} の範囲が広いと例外が発生した 時の特定が難しくなる。 さらに catch句 は全て Exception で受け取るのではなく、それぞれ適切 な例外クラスを用意して利用しましょ う。
  9. Bengo4.com, Inc. 補足すべき例外とそうでない例外 35 • 補足すべき例外 ◦ 例外発生以降も処理が続けられてしまうとデータ不整合など障害に繋がってしまう時 ◦ 例外発生後に呼び出し元やユーザーへの通知、ロギングなどを行いたい時

    ◦ 例外発生前に行っている処理や状態をロールバックしたい時 • 補足すべきでない例外 ◦ 開発時に対処できるタイプエラーなどの例外 ◦ 例外が発生しても、その後に回復処理などが行えない時
  10. Bengo4.com, Inc. ここまで学んだエラーハンドリングを振り返る 38 基幹システムへのAPIで成功レスポン ス(200)が返ってこなかった場合に、 例外を throw して、 ユーザーに対して付与していたポイン

    トをロールバック。 その後開発者向けにロギングと通知、 リダイレクトしてユーザーにエラーが あって、ポイントを付与d系なかったこ とを伝える。