茶漬けの技術メモ

Golang, Rubyで趣味開発します。テックニュース書いたり。ガジェット触ったり。

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 が返ってくるだけです。