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
1.5k
0
Share
楽しく向き合う例外対応
PHPカンファレンス名古屋2025の登壇資料です
okutsu
February 20, 2025
Other Decks in Programming
See All in Programming
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
210
AI駆動開発で崩れていくコードベースを立て直す
kyoko_nr_nr
1
400
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
11
3.1k
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
310
ふつうのFeature Flag実践入門
irof
7
3.4k
Oxcを導入して開発体験が向上した話
yug1224
4
260
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
110
ECR拡張スキャンでSBOMを収集して サプライチェーン攻撃の影響調査を 爆速で終わらせてみた
akihisaikeda
2
210
Migrations : C'est une question d'hygiène !
vinceamstoutz
0
2.5k
AIエージェントと協働するCLI開発 — BunとOpenClawで学んだこと
yoshikouki
1
230
ReactとSvelteのその先、Ripple-TS / Beyond React and Svelte: Ripple-TS
ssssota
3
1.8k
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
1.4k
Featured
See All Featured
Odyssey Design
rkendrick25
PRO
2
650
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Building Applications with DynamoDB
mza
96
7.1k
Designing Powerful Visuals for Engaging Learning
tmiket
1
390
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Mobile First: as difficult as doing things right
swwweet
225
10k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Embracing the Ebb and Flow
colly
88
5.1k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
950
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
130
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