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
}