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
Shumpei O.
December 19, 2024
Programming
0
150
例外処理について考える
2024.12.19
フロントエンドチョットデキル ミニ #01で登壇
Shumpei O.
December 19, 2024
Tweet
Share
More Decks by Shumpei O.
See All by Shumpei O.
Next.js で始めるセキュリティ入門
shumpei0111
0
5
Reactで汎用的なinputコンポーネントを考える
shumpei0111
0
57
複数人での 大規模サイト移植のテクニック
shumpei0111
1
840
個人開発者は Jamstackでブログを書こう!〜WordPressもいいけどJamstackもね〜
shumpei0111
0
110
Other Decks in Programming
See All in Programming
Azure AI Foundryではじめてのマルチエージェントワークフロー
seosoft
0
140
Deep Dive into ~/.claude/projects
hiragram
9
1.6k
アンドパッドの Go 勉強会「 gopher 会」とその内容の紹介
andpad
0
270
NPOでのDevinの活用
codeforeveryone
0
420
Code as Context 〜 1にコードで 2にリンタ 34がなくて 5にルール? 〜
yodakeisuke
0
110
XSLTで作るBrainfuck処理系
makki_d
0
210
Beyond Portability: Live Migration for Evolving WebAssembly Workloads
chikuwait
0
390
エンジニア向け採用ピッチ資料
inusan
0
160
Google Agent Development Kit でLINE Botを作ってみた
ymd65536
2
200
deno-redisの紹介とJSRパッケージの運用について (toranoana.deno #21)
uki00a
0
150
PostgreSQLのRow Level SecurityをPHPのORMで扱う Eloquent vs Doctrine #phpcon #track2
77web
2
390
地方に住むエンジニアの残酷な現実とキャリア論
ichimichi
5
1.4k
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
The World Runs on Bad Software
bkeepers
PRO
69
11k
How to Think Like a Performance Engineer
csswizardry
24
1.7k
Embracing the Ebb and Flow
colly
86
4.7k
For a Future-Friendly Web
brad_frost
179
9.8k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Fireside Chat
paigeccino
37
3.5k
Transcript
例外処理について考える Shumpei / 2024.12.19
Shumpei / chot inc. フロントエンドエンジニア X: @seventhseven https://x.com/seventhseven (mixi2はじめました) 自己紹介
今日のゴール • 例外とエラーとは何かについて知る • 例外処理について考えるきっかけに
おことわり • 例外処理についてあまり深く勉強してこなかったけど、 ずっと気になっていたテーマです • そのため、今回は自分なりにまとめたことを共有する。 という形で発表します • Webアプリケーションを想定しています
結論(めいたもの) • 例外処理に正解はない。 そのシステムに関わる人や状況・性質によってハンドリングするもの。 • 例外処理は安全にアプリケーションが壊れるためにある ”あそび”のようなもの
アジェンダ • 例外とエラーの違い • UIから見る例外処理 • エラーログにあると嬉しいもの • エラークラスを拡張してみる •
まとめ
アジェンダ • 例外とエラーの違い 👈 • UIから見る例外処理 • エラーログにあると嬉しいもの • エラークラスを拡張してみる
• まとめ
例外 プログラムで対処できる問題 • 配列の存在しないインデックスにア クセスしてしまう • 読み込もうとしたファイルが 存在していない etc… 例外とエラーの違い
エラー それ以外のシステムレベルを超えた問 題 • メモリ不足や故障 • 掃除のおばちゃんがサーバの 電源を落とした etc…
例外 プログラムで対処できる問題 • 配列の存在しないインデックスにア クセスしてしまう • 読み込もうとしたファイルが 存在していない etc… 例外とエラーの違い
エラー それ以外のシステムレベルを超えた問 題 • メモリ不足や故障 • 掃除のおばちゃんがサーバの 電源を落とした etc…
例外 プログラムで対処できる問題 • 配列の存在しないインデックスにア クセスしてしまう • 読み込もうとしたファイルが 存在していない etc… 例外とエラーの違い
エラー それ以外のシステムレベルを超えた問 題 • メモリ不足や故障 • 掃除のおばちゃんがサーバの 電源を落とした etc… ただし、現実的には厳密に区別・定義されておらず、コンテキストによってマチマチなのが現状。。。
言語による例外の扱いの違い 言語によっても違いがあります。 JavaScript / Python try/catch で捕捉する機構 や、 throw/raise キーワードに
よる例外を発生させる Go言語 error 型で値を返却する err := errors.New("エラーが 発生しました") Java try/catch で捕捉する機構 や、 検査例外・非検査例外でコ ンパイル時に関数をチェッ クする (現代ではあまり検査例外は使 用されていない模様)
言語による例外の扱いの違い 言語によっても違いがあります。 JavaScript / Python try/catch で捕捉する機構 や、 throw/raise キーワードに
よる例外を発生させる Go言語 error 型で値を返却する err := errors.New("エラーが 発生しました") Java try/catch で捕捉する機構 や、 検査例外・非検査例外でコ ンパイル時に関数をチェッ クする (現代ではあまり検査例外は使 用されていない模様)
言語による例外の扱いの違い 言語によっても違いがあります。 JavaScript / Python try/catch で捕捉する機構 や、 throw/raise キーワードに
よる例外を発生させる Go言語 error 型で値を返却する err := errors.New("エラーが 発生しました") Java try/catch で捕捉する機構 や、 検査例外・非検査例外でコ ンパイル時に関数をチェッ クする (現代ではあまり検査例外は使 用されていない模様)
アジェンダ • 例外とエラーの違い • UIから見る例外処理 👈 • エラーログにあると嬉しいもの • エラークラスを拡張してみる
• まとめ
UIから見る例外処理 システムを使用するユーザが遭遇する例外・エラーの例 • ネットワークエラー • メモリ不足によるハング • 強制終了・異常終了 • バリデーションエラー
• 404 etc…
None
None
None
UIから見る例外処理 処理の結果がユーザが期待するものではないものの、 ユーザが次に取れる行動を示せている点は、 使用者・管理者ともにストレスを緩和する効果がありそうです。
アジェンダ • 例外とエラーの違い • UIから見る例外処理 • エラーログにあると嬉しいもの 👈 • エラークラスを拡張してみる
• まとめ
エラーログにあると嬉しいもの 例外が発生した場合、その処理・プロセスは基本的には直ちに終了するほうが 後続処理に影響がでないため良いです。 ただ、それでも例外処理が必要な場合、 エラーログを適切に設定しておくと原因調査のときに役立ちます。
エラーログにあると嬉しいもの 例外が発生した場合、その処理・プロセスは基本的には直ちに終了するほうが 後続処理に影響がでないため良いです。 ただ、それでも例外処理が必要な場合、 エラーログを適切に設定しておくと原因調査のときに役立ちます。 →トレーサビリティを高くする
トレーサビリティを高くする 下記のようにある程度明確であればシステムのどこで 不具合が起きているのかが追いかけやすい • タイムスタンプ • ログレベル • エラータイプ •
エラーメッセージ • スタックトレース • ブラウザやIPの情報 • システムのバージョン番号 • ユーザロール • エラーがおきたURLや最後に実行したアクション(ボタン クリックなど) • エンドポイント など…
アジェンダ • 例外とエラーの違い • UIから見る例外処理 • エラーログにあると嬉しいもの • エラークラスを拡張してみる 👈
• まとめ
エラークラスを拡張してみる ここでは JavaScript を例に、記事などを引用しつつ紹介します。 https://www.builder.io/blog/safe-data-fetching
エラークラスを拡張してみる 1. ただ try/catch で囲ってみます
エラークラスを拡張してみる 1. ただ try/catch で囲ってみます 2. resが無防備なため、値が正常値か チェックする箇所を追加します。 👉
エラークラスを拡張してみる 3. 単純にErrorインスタンスを作ると、 例外が発生した res が何なのか情報が 渡ってきません。 そこで拡張したクラスを作り、コンストラ クタに res
を受け渡すことで catch 節で 扱えるようになります。
エラークラスを拡張してみる 4. 例えばステータスコードごとに処理を 分けるなどが実装できます。
エラークラスを拡張してみる また、デフォルトで Error クラスでは cause プロパティがあり、 開発者が自由にエラーメッセージを拡張することが出来ます。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Error/cause
エラークラスを拡張してみる cause には err をそのまま詰め込む以 外にも、自身で設定した構造体を 渡すことも出来ます。 try/catch は入れ子にできるので、 自身で例外発生してもその場で処理せ
ず、呼び出し元の関数でハンドリングを 任せる際にも手がかりを渡せるので有 効な手段です。
アジェンダ • 例外とエラーの違い • UIから見る例外処理 • エラーログにあると嬉しいもの • エラークラスを拡張してみる •
まとめ 👈
まとめ 👉 エラー管理の基本方針 • エラーについては管理コストに見合わないため、基本的に例外処理はしない 👉 例外処理の基本方針 • 発生したらただちに終了させる •
後続処理に与える影響を抑えるため、 異常値を見つけたらプロセスやアプリケーションを終了させる • ログを残す場合はトレーサビリティを意識する • 例外処理をしっかりハンドリングしたい場合は拡張することを検討する
まとめ 👉 その他 • バッチ処理などを実装する場合、どうしてもリトライしたいような長い処理時間のものについ ては、重複して処理を行わないことや、エラーが起きたことがわかる ようにしておく
ありがとうございました