Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPのエラーを理解して適切なエラーハンドリングを学ぼう
Search
namizatork
April 04, 2022
Programming
1
3.4k
PHPのエラーを理解して適切なエラーハンドリングを学ぼう
namizatork
April 04, 2022
Tweet
Share
More Decks by namizatork
See All by namizatork
もう細かいレビューは したくない、されたくない
namizatork
0
1.3k
PHPの静的解析 ついでにLarastan
namizatork
0
500
Laravel8.xまでの大きな変更点を振り返る
namizatork
0
470
Livewireは魔法??コードリーディング してみた
namizatork
1
300
Laravelワカンネ(゚⊿゚)から「完全に理解した()」までステップアップ
namizatork
0
1k
Laravelの「Hello World」を 表示するまでの処理を追ってみた
namizatork
0
1.3k
Laravel Hands-on
namizatork
0
330
SPA/PWA/AMPってなに?
namizatork
1
17k
Other Decks in Programming
See All in Programming
クリエイティブコーディングとRuby学習 / Creative Coding and Learning Ruby
chobishiba
0
3.9k
useSyncExternalStoreを使いまくる
ssssota
6
1.2k
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
250
103 Early Hints
sugi_0000
1
230
ある日突然あなたが管理しているサーバーにDDoSが来たらどうなるでしょう?知ってるようで何も知らなかったDDoS攻撃と対策 #phpcon.2024
akase244
1
150
Effective Signals in Angular 19+: Rules and Helpers
manfredsteyer
PRO
0
110
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
410
KubeCon + CloudNativeCon NA 2024 Overviewat Kubernetes Meetup Tokyo #68 / amsy810_k8sjp68
masayaaoyama
0
260
[JAWS-UG横浜 #76] イケてるアップデートを宇宙いち早く紹介するよ!
maroon1st
0
480
MCP with Cloudflare Workers
yusukebe
2
220
競技プログラミングへのお誘い@阪大BOOSTセミナー
kotamanegi
0
360
fs2-io を試してたらバグを見つけて直した話
chencmd
0
240
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Building Applications with DynamoDB
mza
91
6.1k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
28
900
A better future with KSS
kneath
238
17k
Testing 201, or: Great Expectations
jmmastey
40
7.1k
We Have a Design System, Now What?
morganepeng
51
7.3k
Building an army of robots
kneath
302
44k
Site-Speed That Sticks
csswizardry
2
190
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Scaling GitHub
holman
458
140k
Transcript
www.bengo4.com PHPのエラーを理解して 適切なエラーハンドリングを学ぶ PHPerKaigi 2022 2022.4.9 namizato
2 2 並里 辰也(ナミザト タツヤ) 自己紹介 弁護士ドットコム株式会社 在籍そろそろ2年 Laravelが好きだったけど2年位あまり追えてない 最近はバスケばかりしてる
@namizatork
Bengo4.com, Inc. • 一般市民と弁護士を結びつ け、お悩み解決を目指す • 2005年サービス開始 • 利用者数 約1,000万人/
月 • 累計法律相談数 約100万件 3 弁護士ドットコム というサービス https://www.bengo4.com
Bengo4.com, Inc. 弁護士ドットコム Creators’ Blog https://creators.bengo4.com 最新の記事 postcss-preset-envで少し未来のCSSを予習す る デザイナーに優しい
HTMLテンプレートの開発方 針をボトムアップで作った話 サービス運用10年以上の重み、弁護士ドットコム のユニットテスト速度改善 弁護士ドットコムサービスのビジネスと共にみるマ イクロサービスの進化 4
Bengo4.com, Inc. 目次 • 今回の対象者と話す内容 • エラーについて • エラーハンドリングについて •
PHPの例外について • エラーハンドリングを学ぶ • 振り返り 5
今回の対象者と 話す内容 6
Bengo4.com, Inc. 今回の対象者と話す内容 • 対象者 ◦ エラーハンドリングという言葉は知ってるけど何をするの?という人 ◦ PHPのエラー?とりあえずいつもググってるよ!という人 •
話す内容 ◦ エラーについて ◦ エラーハンドリングについて ◦ 適切なエラーハンドリング 7
Bengo4.com, Inc. (一応)本内容での言葉を統一しておく • エラー(エラー処理) • エラーハンドリング(例外処理) • 例外(Exception) 8
エラーについて 9
Bengo4.com, Inc. エラーについて 実行中のプログラムが正常に処理を続行できなくなるような問題・事態のこと。 10
Bengo4.com, Inc. PHPのエラー • PHPのエラーは大きく分類して、致命的なエラー と 警告・注意 が存在する ◦ 致命的なエラー
▪ 現在の処理を中断する、はよ直せ(怒り) ◦ 警告・注意 ▪ 現在の処理は中断しないけど、直した方がいいよ(ハナホジ) 11
Bengo4.com, Inc. PHPの致命的なエラー / 警告・注意 を一部抜粋 • 致命的なエラー ◦ Fatal
error(存在しない関数を呼び出すなどで発生) ◦ Parse error(PHPの文法で間違いがあった時などで発生) • 警告・注意 ◦ Warning(存在しないファイルを呼び出した時などで発生) ◦ Notice(定義されていない変数を使用した時などで発生) 12
Bengo4.com, Inc. 13 Warning や Notice は php.ini などの設定次第で無視 (いわゆる白い画面のアレを表示しない)することは可能。
バグの発生要因になるので、推奨はしない。
エラーハンドリングにつ いて 14
Bengo4.com, Inc. エラーハンドリングについて プログラムがエラーを起こした時にすぐに実行を終了せずにあらかじめ用意しておいた 処理を行うこと。 ユーザー操作によって解決できない問題があった場合に対処するための処理。 15
Bengo4.com, Inc. PHPのエラーハンドリング 5系から導入された try - catch で記述する。 例外が発生し得る箇所を try
{} で囲み、例外が発生した時点で後続する処理は中断 され catch {} で受け取り、例外が発生した時の対応(ハンドリング)を行う。 例外を明示的に(ほとんどはこのケースだと思うが)発生させたい場合は、 該当する箇所で throw を用いる。 16
Bengo4.com, Inc. PHPのエラーハンドリング書き方 17
PHPの例外について 18
Bengo4.com, Inc. 19 実は前述した「PHPのエラー」で紹介した致命的なエラーなどの一部は try - catch で捕捉できません。(方法はあるにはある) ですが、大抵の場合それらを捕捉する必要はありません。 次のページで簡単に
PHP の例外について 触れながら説明していきます。
Bengo4.com, Inc. PHPの例外(Exception) 5系までは、全ての致命的エラーはエラーハンドリングがで きず処理がそこで中断されてしまいます。 しかし、7系からは Throwable インターフェースが実装さ れ、それを継承した Exception
と Error が導入されまし た。そのおかげで致命的エラーの多くが Error をスローす るようになり、捕捉が可能になりました。 右の図(by @ngyuki)は例外の継承関係を図にしたもの です。 20
Bengo4.com, Inc. PHPの例外(Exception) しかし、致命的なエラーの全てが Error に実装されたわけ ではないのが現状です。 ですが、先述した通り全てを捕捉する必要はありません。 大抵のエラーはプログラムやFW側が検知してくれているの で、実装者は開発中に起きたエラーを修正するだけで済み
ます。そのためそれらをエラーハンドリングする必要はあり ません。 21
エラーハンドリングを学 ぶ 22
Bengo4.com, Inc. 23 エラーハンドリングというものについては少しは理解できたけど、 必要性は?どういう時に使えばいいの?など疑問が残っていると思います。 なので、一つ一つQ&A方式で説明していきます。
Q. エラーハンドリング を使わないとどうなる の? 24
Bengo4.com, Inc. Q. エラーハンドリングを使わないとどうなるの? 25 Answer 1. エラーの発生箇所や原因の特定が難しくなる 2. エラー発生後も後続の処理が実行されてしまう
3. エラーが起きていることをユーザーが認知できない 詳しい説明は次の質問と繋がるので省きます。
Q. エラーハンドリング はどんな時に用いる の? 26
Bengo4.com, Inc. Q. エラーハンドリングはどんな時に用いるの? 27 Answer 1. エラーの発生箇所や原因の特定をしたい時 2. エラー発生後に後続の処理を中断させて、別の対応をしたい時
3. エラーが起きていることをユーザーに通知したい時
Bengo4.com, Inc. エラーの発生箇所や原因の特定をしたい時 28 例外が発生した内容を catch句 で受け取り、メッセージなどをロギングしておけば、 発生箇所や発生日時、原因の特定が容易になる。
Bengo4.com, Inc. エラー発生後に後続の処理を中断させて、別の対応をしたい時 29 例外を受け取ったら処理は中断させて、別の対応をしたい時はロギングの時と同様に catch句 の中で行いたい処理を書く。 その際、return をしないと後続してしまうので注意!
Bengo4.com, Inc. エラーが起きていることをユーザーに認知したい時 30 こちらも先ほど同様に catch句 で例外を受け取ったら return で呼び出し元かユーザーにエラーを通 知する。
この対応が抜けているとユーザーは処理が問題なく対処されたと認識してしまう。
Q. エラーハンドリング を考えるうえで大事な ことは? 31
Bengo4.com, Inc. Q. エラーハンドリングを考えるうえで大事なことは? 32 Answer 1. 例外を握り潰さない(物理的にではない) 2. エラーハンドリングのスコープは狭く
3. 補足すべき例外とそうでない例外を理解しよう
Bengo4.com, Inc. 例外を握り潰さない 33 せっかく例外を throw しても catch句 で何もしなければエラーを無視してるも同然です。 catch句
ではロギングの他にエラーの発生を呼び出し元に伝える、後続処理を行わないために return するなど、要件に応じた対応をしましょう。
Bengo4.com, Inc. エラーハンドリングのスコープは小さく 34 様々な例外を全部一つの try {} の中におさめて、catch は全て Exception
で拾ってしまっている try {} の範囲が広いと例外が発生した 時の特定が難しくなる。 さらに catch句 は全て Exception で受け取るのではなく、それぞれ適切 な例外クラスを用意して利用しましょ う。
Bengo4.com, Inc. 補足すべき例外とそうでない例外 35 • 補足すべき例外 ◦ 例外発生以降も処理が続けられてしまうとデータ不整合など障害に繋がってしまう時 ◦ 例外発生後に呼び出し元やユーザーへの通知、ロギングなどを行いたい時
◦ 例外発生前に行っている処理や状態をロールバックしたい時 • 補足すべきでない例外 ◦ 開発時に対処できるタイプエラーなどの例外 ◦ 例外が発生しても、その後に回復処理などが行えない時
振り返り 36
Bengo4.com, Inc. ここまで学んだエラーハンドリングを振り返る 37 基幹システムにユーザーとポイント情 報をAPIでpostしているが、何らかの エラーになってもユーザーにはポイン トが付与されたままになってしまう。
Bengo4.com, Inc. ここまで学んだエラーハンドリングを振り返る 38 基幹システムへのAPIで成功レスポン ス(200)が返ってこなかった場合に、 例外を throw して、 ユーザーに対して付与していたポイン
トをロールバック。 その後開発者向けにロギングと通知、 リダイレクトしてユーザーにエラーが あって、ポイントを付与d系なかったこ とを伝える。
ご清聴ありがとう ございました。 39