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
「どう扱うか」で設計するエラーハンドリング / noren_ts #1
Search
berlysia
March 28, 2025
5.1k
16
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
「どう扱うか」で設計するエラーハンドリング / noren_ts #1
https://dinii.connpass.com/event/348179/
berlysia
March 28, 2025
More Decks by berlysia
See All by berlysia
Webサイトで縦書きを使う、縦書きのWebサイトを作る / BuriKaigi 2026
berlysia
0
190
縦書きWebの実用を支えるJavaScript - JSConf JP 2025
berlysia
1
750
日本語縦書きWebの現在地 2025 - フロントエンドカンファレンス東京
berlysia
6
3.4k
TypeScriptネイティブ移植観察レポート TSKaigi 2025
berlysia
10
5.3k
バレルファイル 使っていいときわるいとき
berlysia
1
2.1k
JavaScriptのモジュール解決の相互運用性 / JSConf JP 2024 - Interoperability of Module Resolutions in JavaScript
berlysia
5
4.8k
CSSレイアウト再入門:完全に理解してCSSを記述するために
berlysia
17
11k
ESLintのローカルルールで独自のコーディング規約を実装する
berlysia
7
4.7k
Webフロントエンドのリプレイスにおけるテストとの付き合い方
berlysia
2
690
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
300
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
Context Engineering - Making Every Token Count
addyosmani
9
970
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
190
Facilitating Awesome Meetings
lara
57
7k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
720
Transcript
「どう扱うか」で設計する エラーハンドリング berlysia / noren.ts #1
エラーハンドリング is 何
Result型を返したあと、どうするか • 例外ではなく Result を返す設計が一般化しつつある • Result を返したあとの判断や振る舞いの話をしたい • 振る舞いの選択は、コードに設計として現れる
• →失敗をどう扱い、どう意味づけるか
「エラー」とは失敗の事実であり、その表現である • 失敗そのものの情報 ◦ Error オブジェクト、またはその派生オブジェクト ◦ Error を継承した独自のオブジェクト ◦
Error を継承しない独自のオブジェクト ▪ DomainExceptionは何にせよ独自オブジェクトだろう • 失敗している結果そのもの ◦ -1, NaN, null, undefined などの文脈に依存した失敗の表現 ◦ 例外的な状態を示すための特定の値や型 • 伝達方法 ◦ throw と try-catch ◦ コールバック関数の引数に渡ってくる (err, data) => {} スタイル ◦ Promise の reject と then/catch, Async Function の await と try-catch ◦ return ▪ Result型は主にこれ
失敗にもいろいろある 種類 例 特徴 ランタイム null / undefined参照 実装ミス、例外 ビジネスロジック
未ログイン、在庫切れ 想定される失敗 致命的 OOM、DB接続断 自己復旧困難 どの失敗も結局ビジネスロジック上の失敗に収斂する ビジネスロジック上の「意味ある失敗」を、どう扱うか
失敗したとき、どう扱いたいか • ログを取る • スキップして続行する • ユーザーに知らせる • 処理をリトライする •
フォールバックする • 呼び出し元の処理全体も失敗させる • 後始末する 失敗がこうした振る舞いに繋がるようにすることこそが設計 エラーハンドリングは、これを思って構成する
振る舞いを選ぶ判断はどこからくるか • 仕様・ドキュメント ◦ 要件としての明文化、設計意図 • 型 ◦ Result<T, E>、enum、インターフェース
• コード ◦ if, switch, try-catch、分岐ロジック • ランタイム ◦ ログ・モニタリング・ユーザーの操作結果 判断材料が振る舞いを選ぶ場所まで伝わる設計が望ましい TypeScriptを使うならば、型にうまいこと現れていると望ましい
インターフェースに扱い方が現れる • 関数のシグネチャは、その関数の「前提」や「期待値」を示す • Result<T, E> を返すことで、「失敗するかも」が明示される • → 設計の意図が、コードの表面に出ている状態
設計は「伝わる形」になって初めて力を持つ
Before / After(throw vs Result)
意味を刻んだラベルとしての「エラー」 • Result型がもたらす情報 ◦ 失敗している可能性があること ◦ 起こりうる失敗にどんな意味があるか ▪ "NotFound", "OutOfStock"
などの分類で、意図を明示 • ラベルがあることで、呼び出し側が振る舞いを判断できる ◦ 適切に呼び出し元に対して失敗の扱いを委ねる、責任を移譲する Result型を使っただけで全てが解決したりはしない 呼び出し側の判断に役に立つ、失敗の設計が求められる
意味を型で定義する:ロジック実装 • 起こりうる失敗にどんな意味があるか ◦ Discriminated Unionによる型レベルでの区別 ◦ instanceofとクラスの継承関係による型レベルでの区別、グルーピング ▪ それぞれ、付随する情報を持ちうる
▪ 📝使う道具は別になんでもいい! • 型により、パターン網羅・振る舞いの分岐が明確になる • テストも、意味単位で確認できる ◦ コード例がほしいね! ごめん! ロジック実装では、意味を定義する側として、失敗を雄弁に表現したい
意味を振る舞いに変える:プレゼンテーション実装 • 設計された意味(=ラベル)を受け取り、判断材料とする • UIや通知など、ユーザーへの伝達に使うための整理・抽象化が行われる ◦ ユーザーに「見せる必要がない」もの ◦ ユーザーに「見せてはいけない」もの ◦
適切な提示への変換 ▪ ……利用者の行動が変化する「何か」に、その知識を変換したい • すべての失敗を厳密に分類しないが、必要な意味は拾いたい • 「判断できるだけの情報」を受け取れる設計が望ましい 表現に使うには、意味が“選べる”形で届く必要がある プレゼンテーション実装では、意味を受け取って、どう振る舞うかを選びたい
意味が振る舞いに変わる
Result型の周りにあること 失敗をどう分類し、どう定義して、意味をあらわすか 失敗のどの意味を使って、どう振る舞うか ロジック実装 プレゼンテーション実装 値と失敗を媒介する道具 Result
Result型の周りにあること 失敗をどう分類し、どう定義して、意味をあらわすか 失敗のどの意味を使って、どう振る舞うか ロジック実装 プレゼンテーション実装 やりたいのは、その処理をしたかった誰かの、次の行動を起こすこと 値と失敗を媒介する道具 Result
おまけ:おすすめResultライブラリ - https://github.com/option-t/option-t - Tree Shakingしやすい! いらないものが生えてない! - 制御構文に無駄に割り込んでこない!
誰 • berlysia ◦ Web engineer (mainly frontend) ◦ 妄想を現実にすることをしている
• 株式会社ドワンゴ 教育事業 ◦ Webフロントをやる人 ◦ Webフロントのためにいろいろやる人 • TSKaigiの中の人 ◦ TypeScriptのカンファレンス TSKaigi 2025 ▪ 5月23日(金)、24日(土)開催 ◦ diniiさんスポンサードありがとうございます! ◦ 今日はネタ被らせないよう大変でした