SwiftのError enumとtry, if case

(2019-11-24)

Error Handling — The Swift Programming Language (Swift 5.1)

SwiftではErrorをenumで列挙でき、次の例でいうsomeParamのようにAssociated valuesを含めることもできる。 throwすると他の言語ではスタックトレースを作るので重い処理になるが、Swiftは作らないのでreturnするようにエラーを返せる。

import UIKit

enum SampleError: Error {
    case ReasonFoo
    case ReasonBar(someParam: Int)
}

func errorFunc() throws -> String {
    throw SampleError.ReasonBar(someParam: 100)
}

throws付きの関数を呼ぶ際はdo-catchするtryか、nilが返るtry?、落ちるtry!のいずれかを付ける。 Associated valuesがある場合、==は使えず、if case .ReasonBar = errorのように比較する。

do {
    try errorFunc()
} catch SampleError.ReasonFoo {
    print("foo!")
} catch SampleError.ReasonBar(let someParam) {
    print("bar! \(someParam)") // => bar! 100
}

do {
    try errorFunc()
} catch let error {
    if case .ReasonBar = error as! SampleError {
        print("error is bar!") // => error is bar!
    }
}

do {
    try? errorFunc() // => nil
} catch is SampleError {
    print(error) // unreachable
}

do {
    try! errorFunc() // => Fatal error
} catch {
    print(error) // unreachable
}