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
80
例外処理について考える
2024.12.19
フロントエンドチョットデキル ミニ #01で登壇
Shumpei O.
December 19, 2024
Tweet
Share
More Decks by Shumpei O.
See All by Shumpei O.
Reactで汎用的なinputコンポーネントを考える
shumpei0111
0
11
複数人での 大規模サイト移植のテクニック
shumpei0111
1
740
個人開発者は Jamstackでブログを書こう!〜WordPressもいいけどJamstackもね〜
shumpei0111
0
84
Other Decks in Programming
See All in Programming
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
600
ある日突然あなたが管理しているサーバーにDDoSが来たらどうなるでしょう?知ってるようで何も知らなかったDDoS攻撃と対策 #phpcon.2024
akase244
2
7.7k
Zoneless Testing
rainerhahnekamp
0
150
return文におけるstd::moveについて
onihusube
1
1.4k
歴史と現在から考えるスケーラブルなソフトウェア開発のプラクティス
i10416
0
250
선언형 UI에서의 상태관리
l2hyunwoo
0
250
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
1
140
PHPで作るWebSocketサーバー ~リアクティブなアプリケーションを知るために~ / WebSocket Server in PHP - To know reactive applications
seike460
PRO
2
720
Findy Team+ Awardを受賞したかった!ベストプラクティス応募内容をふりかえり、開発生産性向上もふりかえる / Findy Team Plus Award BestPractice and DPE Retrospective 2024
honyanya
0
130
Внедряем бюджетирование, или Как сделать хорошо?
lamodatech
0
860
ChatGPT とつくる PHP で OS 実装
memory1994
PRO
3
160
HTML/CSS超絶浅い説明
yuki0329
0
160
Featured
See All Featured
Producing Creativity
orderedlist
PRO
343
39k
Become a Pro
speakerdeck
PRO
26
5.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Statistics for Hackers
jakevdp
797
220k
Site-Speed That Sticks
csswizardry
2
220
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Automating Front-end Workflow
addyosmani
1366
200k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
171
50k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
Faster Mobile Websites
deanohume
305
30k
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から見る例外処理 • エラーログにあると嬉しいもの • エラークラスを拡張してみる •
まとめ 👈
まとめ 👉 エラー管理の基本方針 • エラーについては管理コストに見合わないため、基本的に例外処理はしない 👉 例外処理の基本方針 • 発生したらただちに終了させる •
後続処理に与える影響を抑えるため、 異常値を見つけたらプロセスやアプリケーションを終了させる • ログを残す場合はトレーサビリティを意識する • 例外処理をしっかりハンドリングしたい場合は拡張することを検討する
まとめ 👉 その他 • バッチ処理などを実装する場合、どうしてもリトライしたいような長い処理時間のものについ ては、重複して処理を行わないことや、エラーが起きたことがわかる ようにしておく
ありがとうございました