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
DomainException と Result 型で作る型安全なエラーハンドリング
Search
Hiroaki KARASAWA
March 28, 2025
Programming
0
990
DomainException と Result 型で作る型安全なエラーハンドリング
noren.ts #1
Hiroaki KARASAWA
March 28, 2025
Tweet
Share
More Decks by Hiroaki KARASAWA
See All by Hiroaki KARASAWA
スタートアップでポストモーテムを4年で200回やって得た学び
karszawa
0
7
成功する技術選定について
karszawa
2
2.5k
飲食店のインフラサービス “ダイニー” のトラブル対応のすべて
karszawa
0
49
Google Cloud のモニタリング製品を徹底活用してみた
karszawa
0
51
ダウンタイム 30 秒で AlloyDB に移行した話
karszawa
0
480
DMS で AlloyDB に簡単移行!
karszawa
0
55
【現場の本音】App Engine から Cloud Run に移行してみた
karszawa
0
150
cls-hooked による実行コンテキストの保存と利用
karszawa
0
870
Hasura の Relationship と権限管理
karszawa
0
920
Other Decks in Programming
See All in Programming
Serving TUIs over SSH with Go
caarlos0
0
540
State of Namespace
tagomoris
5
2.4k
ComposeでWebアプリを作る技術
tbsten
0
130
ニーリーQAのこれまでとこれから
nealle
2
150
VitestのIn-Source Testingが便利
taro28
8
2.4k
AI時代の開発者評価について
ayumuu
0
230
M5UnitUnified 最新動向 2025/05
gob
0
120
Boost Your Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
740
20250429 - CNTUG Meetup #67 / DevOps Taiwan Meetup #69 - Deep Dive into Tetragon: Building Runtime Security and Observability with eBPF
tico88612
0
160
Contribute to Comunities | React Tokyo Meetup #4 LT
sasagar
0
590
Instrumentsを使用した アプリのパフォーマンス向上方法
hinakko
0
230
AIコーディングの理想と現実
tomohisa
35
37k
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
54
5.5k
Build The Right Thing And Hit Your Dates
maggiecrowley
35
2.7k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
A designer walks into a library…
pauljervisheath
205
24k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Why Our Code Smells
bkeepers
PRO
336
57k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
Designing for humans not robots
tammielis
253
25k
Building a Modern Day E-commerce SEO Strategy
aleyda
40
7.2k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Six Lessons from altMBA
skipperchong
28
3.7k
Reflections from 52 weeks, 52 projects
jeffersonlam
349
20k
Transcript
© 2025 Dinii Inc. DomainException と Result 型で作る 型安全なエラーハンドリング noren.ts
#1 2025-03-28 Hiroaki KARASAWA
株式会社 ダイニー © 2025 Dinii Inc. ※こちらの枠内に詳細や、画像を記載/貼り付けしてください。 白枠は、必要に応じて消していただいても大丈夫です。 @karszawa Introduction
Hiroaki KARASAWA (karszawa) 株式会社ダイニー VP of Technology Google Champion Innovator → Google Developer Experts (Modern Architecture, Serverless Application, Data) 趣味: HUNTER×HUNTER 自己紹介
株式会社 ダイニー © 2025 Dinii Inc. 01 02 03 04
05 ダイニーの事業・技術・プロダクトについて JavaScript のエラーを二種類に分類 DomainException & Result 型について紹介 サードパーティーライブラリと比較 総括 資料名を記載
株式会社 ダイニー © 2025 Dinii Inc. ダイニーの事業・技術・プロダクトについて 01 資料名を記載
株式会社 ダイニー © 2024 Dinii Inc. 飲食店の売上UPに貢献する唯一無二のスーパーモバイルPOS オペレーションなしで 売上UP! AIと専属スタッフにお任せ
お客様を 自動で会員化 自動販促 メッセージ アンケート 自動回収 店員への チップ/投げ銭 圧倒的な 使いやすさで 客単価UP ロイヤルティ プログラム 顧客情報を 接客に活用
ダイニーが目指すのは、 ダイニーについて 株式会社ダイニー | Company Deck for Product © 2025
Dinii Inc.
TypeScript, React による言語・フレームワークの統一 ダイニーについて 複数プロダクトを跨った機能修正でも、一つのチームで担当することができる 株式会社ダイニー | Company Deck for
Product © 2025 Dinii Inc.
株式会社 ダイニー © 2025 Dinii Inc. ダイニーについて 計測してみた。 ※ TypeScript
のコードのみを計測 ※ 自動生成コードを除外 バックエンドコードベースの規模を紹介します。 3,000 files 340,000 lines ⛰ 2020年からの積み重ね ⛰
本日のトピック
TypeScript のエラーハンドリングを極める
良いね…
株式会社 ダイニー © 2025 Dinii Inc. ダイニーについて 資料名を記載 下記の点に注意して発表をお聞きください。 1.
NestJS のバックエンドサービス 2. 普通の HTTP Web サーバー 3. 2020年頃 の意思決定が色濃く反映されている 4. クライアントのエラーハンドリングは懇親会で話そうね Disclaimer
株式会社 ダイニー © 2025 Dinii Inc. JavaScript のエラーを二種類に分類 02 資料名を記載
株式会社 ダイニー © 2025 Dinii Inc. 資料名を記載 JavaScript のエラーを分類 注文
→ 在庫確認 👀 → 在庫なし 🫥 → エラー! 🚨 何かしらの異常なので全く発生しないのが期待値 サードパーティー製のライブラリも基本的にこの形式でエラーを返し てくる…。 1) ランタイムエラー システムエラーではないが、ユーザー体験に悪影響の可能性 一定数は発生が想定される。 2) ビジネスロジックのエラー
株式会社 ダイニー © 2025 Dinii Inc. JavaScript のエラーを分類 資料名を記載 e.g.
Node.js 自体のメモリリーク もはや TypeScript は関係ない ベストプラクティス • ちゃんとヘルスチェックを実装して怪しいやつはどんどん kill していこう • kill を監視して Profiler で分析しよう Node.js に詳しいお兄さんたちに聞いてみよう もう一つのエラー = 処理系のエラー (Fatal Error)
株式会社 ダイニー © 2025 Dinii Inc. JavaScript のエラーを分類 資料名を記載 独自実装部分は
TypeScript を真面目に活用すればほぼ抑制できる 問題はサードパーティー製のライブラリが throw するエラー そもそも throw されることを関知できるデザインになっていない IMO: 真面目に対処することを前提とせず(無理なので)、大域での error handelr を基本とするべき ※ もちろん発生が予期されるもの、頻発するものは真面目に try-catch したら良い 1) ランタイムエラーの対処
株式会社 ダイニー © 2025 Dinii Inc. JavaScript のエラーを分類 資料名を記載 ここが本日の本題
言いたいこと とにかく throw するな 2) ビジネスロジックのエラー
株式会社 ダイニー © 2025 Dinii Inc. JavaScript のエラーを分類 資料名を記載 とにかく
throw するな → throw した時点で型情報が失われてしまう 型情報が残っていると何が嬉しいか → エラーの対処を強制するコードベースデザインが可能になる ダイニーでは DomainException というクラスを利用している → が、とにかく throw しなければ何でも良いと思っている ※ エラーではなく「例外 – Exception」と呼ぶ(ただの決めの話) ビジネスロジックのエラーのベストプラクティス
株式会社 ダイニー © 2025 Dinii Inc. DomainException & Result 型
03 資料名を記載
株式会社 ダイニー © 2025 Dinii Inc. DomainException & Result 型
資料名を記載 DomainException という基底クラスを継承した例外種別ごとに別々のクラス(ダイニー独自実装) DomainException とは?
株式会社 ダイニー © 2025 Dinii Inc. DomainException & Result 型
資料名を記載 1) 基底クラスで具象クラスをすべてハンドリングできるから なぜクラスなのか?
株式会社 ダイニー © 2025 Dinii Inc. DomainException & Result 型
資料名を記載 2) 追加情報を付与できるから なぜクラスなのか?
株式会社 ダイニー © 2025 Dinii Inc. DomainException & Result 型
資料名を記載 1) 実際の例外が発生している箇所で new する 具体的な使い方
株式会社 ダイニー © 2025 Dinii Inc. DomainException & Result 型
資料名を記載 1) エラーをハンドリングしたい任意の箇所 or リクエストハンドラーでハンドリングする 具体的な使い方 リクエストハンドラー ドメインロジックの どこか
株式会社 ダイニー © 2025 Dinii Inc. DomainException & Result 型
資料名を記載 instanceof DomainException を利用した徹底したハンドリング 徐々に型が 絞り込まれる
株式会社 ダイニー © 2025 Dinii Inc. DomainException & Result 型
資料名を記載 人間たまには throw したくなる バグでしかそうならないとき • 何かおかしなことが起こっているのでそこで止めたい = ランタイムエラーと同様に扱う • 基本的には型的にハンドリングしたいがそう上手くいかないときもあるよね 逆に throw する場合
株式会社 ダイニー © 2025 Dinii Inc. DomainException & Result 型
資料名を記載 TypeScript には union があるので Result, Either 的な概念が無くても良いが… すべてのエラーをハンドリングするまで型補完が効かないので使用感が悪い が、これも TypeScript 4.x の時代の話なので今は良い感じに補完してくれるのかも… Result 型 – 「正常値」か「エラー」を返すことを表現 union を使う場合
株式会社 ダイニー © 2025 Dinii Inc. エラーハンドリング 型定義 DomainException &
Result 型 資料名を記載 Result 型でプログラミングの見通しを良くする Result 型は 多くのプログラミング言語で ネイティブサポートされている
株式会社 ダイニー © 2025 Dinii Inc. サードパーティーライブラリと比較 04 資料名を記載
株式会社 ダイニー © 2025 Dinii Inc. サードパーティーライブラリと比較 資料名を記載 実はサードパーティーの似たようなライブラリがある。 サードパーティーライブラリとの比較
株式会社 ダイニー © 2025 Dinii Inc. サードパーティーライブラリと比較 資料名を記載 NeverThrow かな?
シンプルなため一定のルールは必要そう(例: err をネストしない)。 元の実装も1000行程度なので、独自のフレームワーク等と組み込みたいなら独自実装もぜんぜんアリ TypeScript の進化で工夫が要らなくなった。 ありがとう TypeScript 💖 2025年からプロジェクトを始めるなら…(IMO)
株式会社 ダイニー © 2025 Dinii Inc. まとめ 資料名を記載 ダイニーでは DomainException
+ Result 型で型安全なバックエンドを構築しています。 2020年当時としては良い判断だったと思いますが、 今はサードパーティの良い感じのライブラリを使うこともできます。 ともかく コミュニティのデフォルトとして Error を throw というのが辛い。 ので、勉強会でエラーハンドリングについて語って JS コミュニティを一ミリでも動かしたい。 まとめ
株式会社 ダイニー © 2025 Dinii Inc. まとめ 資料名を記載 事業会社のソフトウェアエンジニアに役立つ情報をほぼ毎日発信しています。 X
発信強化中! 『dinii karasawa』で検索 フォローしてね!
株式会社 ダイニー © 2025 Dinii Inc. まとめ 資料名を記載 #noren_ts でご質問ください!
質問は X で募集中!