👮

[Swift] エラーの分類について

2022/10/02に公開

説明

プログラムによって発生するエラーは様々にありますが、プログラマーがエラーに対しどのように反応させるのかによっていくつかに分類できます。

Swiftではエラーを明確にするため、4種類のエラーを提案しています。

  • Simple domain errors (単純なドメインエラー)
  • Recoverable errors (回復可能なエラー)
  • Universal errors (普遍的なエラー)
  • Logic failures (論理的な失敗)

Simple domain errors

String.ToInt()のように、「間違った状態」だけを返却します。

Swiftでは「Optional」として戻り値を定義します。つまり正しい値か、nilが返ってくる状態にします。

Recoverable errors

ファイルが見つからない、ネットワークタイムアウトなど、ユーザーの操作によって復旧可能なエラーを指します。

例えばネットワークエラーの場合、以下の原因が考えられます。

  • オフライン状態です
  • 寸断が発生しています
  • クライアントで投げたAPIの値が不正です
  • サーバーがビジー状態です
  • サーバーがハードウェアの故障を起こしています

そのうちのいくつかはクライアント側で解決できるものもあれば、サーバーの回復を待つ必要があるときもあります。

多くは現在の処理を中止、クリーンアップを行い、ユーザーに報告する動作で回復をはかります。エラー処理で考える場合、エラーが発生した地点から元の呼び出し場所まで、エラーを伝搬させます。

Universal errors

実行時に引き起こされる、強制終了をさせるエラーです。

例えば以下のようなエラーが該当します。

  • プロセスが「SIGINT」を受信して強制終了しています
  • スレッドの強制終了が発生しています
  • メモリ不足によるエラーです
  • スタックオーバーフローが起きています

プログラミングでは通常、オブジェクトへのプロパティをアクセスしたときにエラーが発生することは考えられません。しかし例えばそのプロパティはメモリへのアクセスではなく、データベースへのアクセスの場合は、クエリが失敗してエラーが発生する、という可能性が出てきます。

こういった分かりにくいエラーもUniversal errorsに該当します。これは避けるべきですが、言語の仕様によってエラーを見つけ、解消することは難しいです。

Logic failures

プログラミングのミスによって発生するエラーです。

  • 配列へのアクセス時に範囲外のインデクスを指定しました
  • Optional型で実際にはnilが入っているのに、強制的に正しい型でアクセスしようとしました

こういったものは通常、コードを修正することによって解消します。

参考

GitHubで編集を提案

Discussion