Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
例外処理について考える
Search
Shumpei O.
December 19, 2024
Programming
0
200
例外処理について考える
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
7
Reactで汎用的なinputコンポーネントを考える
shumpei0111
0
110
複数人での 大規模サイト移植のテクニック
shumpei0111
1
920
個人開発者は Jamstackでブログを書こう!〜WordPressもいいけどJamstackもね〜
shumpei0111
0
140
Other Decks in Programming
See All in Programming
社内オペレーション改善のためのTypeScript / TSKaigi Hokuriku 2025
dachi023
1
300
Querying Design System デザインシステムの意思決定を支える構造検索
ikumatadokoro
1
1.2k
Module Harmony
petamoriken
2
600
Stay Hacker 〜九州で生まれ、Perlに出会い、コミュニティで育つ〜
pyama86
2
3.3k
ViewファーストなRailsアプリ開発のたのしさ
sugiwe
0
330
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
160
JJUG CCC 2025 Fall: Virtual Thread Deep Dive
ternbusty
3
510
20 years of Symfony, what's next?
fabpot
2
250
JJUG CCC 2025 Fall Javaコミュニティの歩き方 〜参加から貢献まで、すべて教えます〜
takasyou
0
810
CSC305 Lecture 15
javiergs
PRO
0
220
React Native New Architecture 移行実践報告
taminif
1
130
All(?) About Point Sets
hole
0
240
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
Visualization
eitanlees
150
16k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
For a Future-Friendly Web
brad_frost
180
10k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Docker and Python
trallard
46
3.7k
Optimizing for Happiness
mojombo
379
70k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Agile that works and the tools we love
rasmusluckow
331
21k
Done Done
chrislema
186
16k
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から見る例外処理 • エラーログにあると嬉しいもの • エラークラスを拡張してみる •
まとめ 👈
まとめ 👉 エラー管理の基本方針 • エラーについては管理コストに見合わないため、基本的に例外処理はしない 👉 例外処理の基本方針 • 発生したらただちに終了させる •
後続処理に与える影響を抑えるため、 異常値を見つけたらプロセスやアプリケーションを終了させる • ログを残す場合はトレーサビリティを意識する • 例外処理をしっかりハンドリングしたい場合は拡張することを検討する
まとめ 👉 その他 • バッチ処理などを実装する場合、どうしてもリトライしたいような長い処理時間のものについ ては、重複して処理を行わないことや、エラーが起きたことがわかる ようにしておく
ありがとうございました