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
楽しく向き合う例外対応
Search
okutsu
February 20, 2025
Programming
0
1.2k
楽しく向き合う例外対応
PHPカンファレンス名古屋2025の登壇資料です
okutsu
February 20, 2025
Tweet
Share
Other Decks in Programming
See All in Programming
Building, Deploying, and Monitoring Ruby Web Applications with Falcon (Kaigi on Rails 2025)
ioquatix
4
2.2k
CSC509 Lecture 03
javiergs
PRO
0
340
What's new in Spring Modulith?
olivergierke
1
150
品質ワークショップをやってみた
nealle
0
290
アメ車でサンノゼを走ってきたよ!
s_shimotori
0
220
「ちょっと古いから」って避けてた技術書、今だからこそ読もう
mottyzzz
11
6.7k
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
1
450
CSC305 Lecture 04
javiergs
PRO
0
270
非同期jobをtransaction内で 呼ぶなよ!絶対に呼ぶなよ!
alstrocrack
0
940
(Extension DC 2025) Actor境界を越える技術
teamhimeh
1
250
詳しくない分野でのVibe Codingで困ったことと学び/vibe-coding-in-unfamiliar-area
shibayu36
3
5k
Claude CodeによるAI駆動開発の実践 〜そこから見えてきたこれからのプログラミング〜
iriikeita
0
250
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
185
22k
A Tale of Four Properties
chriscoyier
161
23k
KATA
mclloyd
32
15k
The Straight Up "How To Draw Better" Workshop
denniskardys
238
140k
Reflections from 52 weeks, 52 projects
jeffersonlam
353
21k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
9
590
Typedesign – Prime Four
hannesfritz
42
2.8k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
620
Site-Speed That Sticks
csswizardry
12
900
RailsConf 2023
tenderlove
30
1.2k
Transcript
楽しく向き合う例外対応 おくつ #phpcon_nagoya 1
$whoami = [ '名前' => 'おくつ', '所属' => '株式会社カオナビ', '職種'
=> 'バックエンドエンジニア', '特技' => '暮らし', '一言' => 'スイカが好きです', ]; #phpcon_nagoya 自己紹介 2
本番環境の例外対応をした経験ありますか? 楽しかったですか? 以降は、Laravel で構築されたアプリケーションにおける 例外の話をします。 #phpcon_nagoya 3
Laravel(11.x) では、 アプリケーション内の例外を bootstrap/app.php の withExceptions メソッドを使用して、 例外をどのように報告するかを管理できます。 以降ではアプリケーション内での例外について、 通知したい例外クラスのみ
Slack の特定チャンネルで報告している前提としたいと思います。 #phpcon_nagoya Laravel における例外管理(Exception ) 4
報告 原因 調査 / 再現確認 報告 対応 振り 返り 報告
検知 対応 検討 #phpcon_nagoya 対応の流れ 5
#phpcon_nagoya 検知 6
まずは第一報を上げる 原因は分からないが、何かが発生していることを周知することで 関係者の確認コストが減ります。 発生日時 影響範囲( 対象ユーザ・機能) 事象 #phpcon_nagoya 報告 7
具体的なエラーメッセージやスタックトレースを確認 直近のデプロイや設定変更の確認 #phpcon_nagoya 原因の確認 8
エラー内容から、 直近のデプロイや設定変更の影響であることが明らかな場合、 戻します。 #phpcon_nagoya 原因の確認 9
エラーを再現していきます。 手がかりを集め、 条件や再現手順を特定します。 ( 名探偵になった気持ちで) #phpcon_nagoya 原因調査および再現確認 10
データの問題であるというエラーの場合、 データベースの値を確認をします。 そのデータの状態があり得るのか、 何者かによって変更されたのか判断します。 #phpcon_nagoya 原因調査および再現確認 11
時系列で事象を整理 単発の操作では再現できないとき 前後のアクセスログを時系列で並べ てみます。 #phpcon_nagoya 原因調査および再現確認 12
開発環境では再現できないな 本番環境と開発環境の違いによる影響を考えます。 たとえば、 キャッシュの仕組みが異なる データベースの構成が異なる など #phpcon_nagoya 原因調査および再現確認 13
( ※注意:叫ぶ場所は選ぶこと) #phpcon_nagoya 開発環境で再現できました! 14
回避方法の検討をします。 もし、修正がすぐにできなかったとしても 回避する方法を用いて ユーザの目的が達成できるのであれば それを考えてみます。 #phpcon_nagoya 対応検討 15
コードに問題があるのであれば、修正方法を検討します。 #phpcon_nagoya 対応検討 16
ユーザにとってより良くて、 かつ通知が来ない方法がないかという別の観点を考えてみます。 データがなかった場合 ユーザ入力値に問題がある場合( もしくは不正なリクエスト) ユーザ操作には影響させなくてよい場合 #phpcon_nagoya 対応検討 17
データがなかった場合 元 $user = User::find($id); return response()->json([ 'id' => $user->id;
// $userがnullの時、ここでエラーになる ]); #phpcon_nagoya 対応検討 18
データがなかった場合 こうする $user = User::find($id); if (!$user) { // データが存在することをチェックする
throw new NotFoundHttpException('該当のユーザは見つかりませんでした。'); } return response()->json(['id' => $user->id;]); ※ Laravel は、あらかじめいくつかのタイプのエラーを無視しています。NotFoundHttpException は無視 されています。 #phpcon_nagoya 対応検討 19
ユーザ入力値に問題がある場合( もしくは不正なリクエスト) 元 $user_name = $request->input('user_name'); // usersテーブルのnameにNOT NULL 制約あり
User::create(['name' => $user_name]); リクエストの 'user_name' がnull の時... #phpcon_nagoya 対応検討 20
ユーザ入力値に問題がある場合( もしくは不正なリクエスト) こうする // バリデーションで弾かれた場合、ValidationException $request->validate([ 'user_name' => 'required|string|min:3|max:20', ]);
$user_name = $request->input('user_name'); User::create(['name' => $user_name]); ※ レスポンスを受け取る側で、エラーメッセージを表示する仕組みを作る必要があります。 #phpcon_nagoya 対応検討 21
ユーザ操作には影響させなくてよい場合 たとえばログ通知の失敗とか、特定のオプション機能の失敗など class MyCustomValidationException extends Exception try { // 何か処理
} catch (MyCustomValidationException $e) { // 独自例外のみ捕捉し、何かする } // その他の例外はそのままthrow #phpcon_nagoya 対応検討 22
発生日時 影響範囲( 対象ユーザ・機能) 事象 原因 回避方法 対応目処 #phpcon_nagoya 報告 23
伝わる言葉でユーザの知りたいことを報告します。 ユーザが知りたい情報は、 自分にどんな影響があるのか どうすれば解決できるのか、あるいは待つしかないのか #phpcon_nagoya 報告 24
対応が完了したら、完了報告します。 #phpcon_nagoya 対応 → 完了報告 25
人への責任のなすりつけ合いではなく、 再発防止に目を向けましょう。 ノーム・カースの最優先条項 今日見つけたものが何であれ、 チームの全員が、その時点でわかっていたことや スキルおよび能力、利用可能なリソースを余すことなく使って、 置かれた状況下でベストを尽くした、ということを疑ってはならない。 #phpcon_nagoya 振り返りをしよう https://scrapbox.io/iki-iki/
ノーム・カースの最優先条項 26
例外通知対応があるなんて、 ユーザが使っている証拠だからありがたいですね 楽しく、冷静に、そしてユーザ視点で対応していきましょう! #phpcon_nagoya まとめ 27
ご清聴ありがとうございました #phpcon_nagoya 28