対象:
Swift3

tryキーワードによるエラーハンドリング(Swift)

Foundation Frameworkのクラスを使うとき、実行時にエラーがスローされる可能性のあるメソッドがある。このようなランタイムエラーは、tryキーワードを使って簡単にハンドリングできる。

try?キーワードはエラーをOptionalに変換してくれる。従って、メソッドがランタイムエラーをスローする可能性がある場合、そのメソッドの戻り値をif文で評価してnilでなければエラーはないと分かる。

        if let num = try? throwingError(0) {
            print(num)
        } else {
            print("Error!")
        }

try!キーワードはランタイムエラーの伝搬(=コンパイル時チェック)を無効にしてくれる。メソッドはランタイムエラーをスローする可能性があるが、実際にはエラーにならない場合、try!キーワードでエラーの伝搬を無効にすることができる。The Swift Programming Languageでは、アプリ内の画像をロードする場合が例として挙げられている。

        let num = try! throwingError(0)

Do-Catchを使ってエラー時の処理を書くこともできる。catch節でパターンを指定することができるので、エラーの種類別に処理をしたい時には有効な手段となる。catch節でエラーの種類を指定したくない場合、何も書かなければすべてにマッチする。また、catch節は上から順に評価されるので、以下のようにいくつかのエラーとそれ以外で処理を分けた書き方も可能である。

        do {
            let num = try throwingError(3)
            print(num)
        } catch TestError.first {
            print("first")
        } catch TestError.second {
            print("second")
        } catch {
            print("Error!")
        }

エラーをスローするメソッドのほうは、例えばこんな風に書ける。エラーをスローする可能性のあるメソッドは、引数リストの後にthrowsを宣言する。

    enum TestError: Error {
        case first
        case second
        case otherwise
    }
    
    func throwingError(_ sw: Int) throws -> Int {
        if sw == 1 {
            throw TestError.first
        } else if sw == 2 {
            throw TestError.second
        } else if sw >= 3 {
            throw TestError.otherwise
        }
        
        return 100
    }
(2015/10/18)
() Swift 3.0対応。

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright© 2004-2019 モバイル開発系(K) All rights reserved.
[Home]