エラー関連
エラーを通知するthrow処理
処理の途中でエラーが発生した際にはそのエラーを通知し、エラーごとに適した処理をプログラマが行えるようにするための仕組みがSwiftには用意されています。エラー発生時の処理の流れのイメージ図を見てみましょう。
・エラー発生時の処理の流れ
この図では、エラー発生時の処理を関数Aに記述しているので、関数Cのthrow処理は、関数Aに通知されます。関数Cのようなthrow処理を行う可能性がある関数は、次のように記述します。
1 |
func 関数名(引数名: 型) throws -> 戻り値の型 |
実際にthrow処理を行うには、次の書式で記述します。
1 |
throw エラータイプのプロトコルに準拠したenum |
エラータイプのプロトコルに準拠したenumとしては、Errorプロトコルに準拠した独自のエラータイプを用意する必要があります。enumについては2-3節で、プロトコルについてはレクチャー5で紹介しています。
ではコード例を見ておきましょう。Errorプロトコルに準拠したenumであるMyErrorというenumを宣言し、引数valueの値が「0」よりも小さいときに「InvalidValue」という値のエラーがthrowされる記述になっています。
1 2 3 4 5 6 7 8 9 10 11 12 |
// エラータイプの宣言 enum MyError: Error { case Inval idValue } // エラーをthrowする可能性がある関数 func doubleUp (value: Int) throws -> Int { if value < 0 { throw MyError.InvalidValue } return value * 2 } |
エラーをハンドリングする
throwsが宣言されている関数を利用する場合は、throwで通知されるエラーをハンドリングする必要があります。エラーをハンドリングするには、対象となる関数をdo ~ try ~ catch文で囲む必要があります。先ほどのthrowを利用した処理に、エラーがあったかどうかで、正常終了したかエラーが発生したかを出力するハンドリングを追加してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// エラータイプの宣言 enum MyError: Error { case InvalidVa>lue } // エラーをthrowする可能性がある関数 func doubleUp (value: Int) throws -> Int { if value < 0 { throw MyError.InvalidValue } return value * 2 } // エラーハンドリングが必要なdoubleUp関数を利用 do { var doubleResultValue = try doubleUp(value: 10) //try句を付ける必要がある print("正常終了") } catch MyError. InvalidValue { print("エラー発生") } |