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
140
例外処理について考える
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
56
複数人での 大規模サイト移植のテクニック
shumpei0111
1
830
個人開発者は Jamstackでブログを書こう!〜WordPressもいいけどJamstackもね〜
shumpei0111
0
110
Other Decks in Programming
See All in Programming
TypeScript LSP の今までとこれから
quramy
1
500
Effect の双対、Coeffect
yukikurage
5
1.4k
プロダクト開発でも使おう 関数のオーバーロード
yoiwamoto
0
150
機械学習って何? 5分で解説頑張ってみる
kuroneko2828
0
200
GoのGenericsによるslice操作との付き合い方
syumai
2
530
コードに語らせよう――自己ドキュメント化が内包する楽しさについて / Let the Code Speak
nrslib
6
1.4k
DroidKnights 2025 - 다양한 스크롤 뷰에서의 영상 재생
gaeun5744
2
130
Practical Tips and Tricks for Working with Compose Multiplatform Previews (mDevCamp 2025)
stewemetal
0
120
単体テストの始め方/作り方
toms74209200
0
430
Rails産でないDBを Railsに引っ越すHACK - Omotesando.rb #110
lnit
1
160
Perlで痩せる
yuukis
1
680
F#で自在につくる静的ブログサイト - 関数型まつり2025
pizzacat83
0
290
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
The Pragmatic Product Professional
lauravandoore
35
6.7k
We Have a Design System, Now What?
morganepeng
52
7.6k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
4
130
How GitHub (no longer) Works
holman
314
140k
Writing Fast Ruby
sferik
628
61k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
52
2.8k
Thoughts on Productivity
jonyablonski
69
4.7k
How STYLIGHT went responsive
nonsquared
100
5.6k
Typedesign – Prime Four
hannesfritz
42
2.7k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.3k
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から見る例外処理 • エラーログにあると嬉しいもの • エラークラスを拡張してみる •
まとめ 👈
まとめ 👉 エラー管理の基本方針 • エラーについては管理コストに見合わないため、基本的に例外処理はしない 👉 例外処理の基本方針 • 発生したらただちに終了させる •
後続処理に与える影響を抑えるため、 異常値を見つけたらプロセスやアプリケーションを終了させる • ログを残す場合はトレーサビリティを意識する • 例外処理をしっかりハンドリングしたい場合は拡張することを検討する
まとめ 👉 その他 • バッチ処理などを実装する場合、どうしてもリトライしたいような長い処理時間のものについ ては、重複して処理を行わないことや、エラーが起きたことがわかる ようにしておく
ありがとうございました