Swiftのエラー処理
Swiftのエラー処理の書き方について調べたので、まとめておこうと思います。
エラーを定義
Errorプロトコルを継承した列挙型でエラーを定義します。
Errorプロトコルの中身は空になっています。
enum myError: Error{ case stringError case unexpectedError }
エラーを投げる関数
エラーを投げる可能性のある関数を宣言する場合は、throwsを使って定義する必要があります。
func myFunc() throws { throw myError.stringError }
throwsを書いているからといって、必ずしもエラーを投げる必要はありません。あくまで、エラーを投げる可能性のある関数ということです。
エラーを投げる関数を呼び出す
do{}内でエラーが起こりそうな関数を呼び出す前に、tryをつけます。
実際にエラーが起こった場合の処理をcatch{}内にかいていきます。エラーには引数を設定することもできます。
do { try myFunc(hoge: "hogehoge") } catch myError.stringError(let count) { print(count) } catch myError.unexpectedError { print("unexpected error") }
エラー処理を行う一連のコードを以下に表示します。
enum myError: Error{ case stringError(count: Int) case unexpectedError } func myFunc(hoge: String) throws { let hogeCount = hoge.characters.count if(hogeCount <= 0){ throw myError.stringError(count: hogeCount) } else { throw myError.unexpectedError } } do { try myFunc(hoge: "hogehoge") } catch myError.stringError(let count) { print(count) } catch myError.unexpectedError { print("unexpected error") }
エラー処理を書く必要がない時
エラーを起こさないことがあらかじめ分かっている時は、エラー処理をわざわざ書くのが面倒です。そのときはtry! でエラー処理を実装せずに呼び出すことができます。
try! myFunc()
しかし、この書き方でエラーが起こった場合は、アプリがクラッシュします。
try! try?
try? を使うと、返り値をオプショナルで受け取ることができます。
エラーの場合はnilが返ってくるようです。
try!,try?いづれも、do, catch 文を書く必要がありませんが、エラーが起こった場合に、try!ではアプリがクラッシュしますが、try? の場合はnil が返ってくるだけです。