Open8
Swift 6 Typed throws
Untyped throws だと any Error
が返るので、全ての catch
が必要になっていた
Typed throws だと Error
の型を指定できる
- Typed throws の括弧は必須。 async await などの effect と区別ができない
- 複数のエラーは定義できない。 catch する側で複数あると困る。複数あっても rethrow するだけになりがちなのでない方がシンプルで関数の設計面でも良いのでは
Typed throws は安易に使うべきではない
使うべき時
- モジュールやパッケージの中に閉じてエラーハンドリングするような場合
- map の rethrows や Result のようにそれ自体がエラーを生み出さない場合
- Existential が使えない/オーバーヘッドが許容できない場合
詳細はプロポーザルを参照
Typed throws は戻り値の型と同じ意味を持つので、それを強制したい時であれば有効である
Result 型にも同様のことは言える
- Simple domain errors: エラーの原因が明確ですぐに判断・処理できるもの。 guard で十分
- Recoverable errors: エラーの原因が多岐に渡る場合。原因に応じてハンドリングが必要 do-try-catch
- Univeral errors: OOM などエラーハンドリングができないもの
- Logic failures: コードの誤りが原因。動的に修正するのではなく、コードを修正できるように
precondition
などを利用する