■エラーハンドリング
エラーが出る可能性がある処理を行う時に使う
これエラーやでってなったらエラーの処理を返す
エラーじゃなかったらそのまま処理される。
■エラーの例: こんな時に使う!!
割り算で引数n2が0の場合エラーになる。
割り算は0で割れないから
//n2が0ならprint("0以外を入力してね")
//n2が0以外ならreturn n1 / n2
func div2(n1: Int,n2:Int) -> Int? {
guard n2 != 0 else {
print("0以外を入力してね")
return nil
}
return n1 / n2
}
正直上記の書き方でもできるがそれをぱっと見だけで
エラー処理しとるんやなって分かるように書くのがthrows try do catchとかを使ったやつ!!
■throws
まず書き方
//enumでまずエラー出た時の処理を書く Errorプロトコルを継承してる
enum CalculationError: Error {
case divisionBYZero
case unknown
}
func div(n1: Int,n2:Int) throws -> Int {
guard n2 != 0 else {
throw CalculationError.divisionBYZero
}
return n1 / n2
}
/* 見比べたら何が違うのか結構分かりやすい!
func div2(n1: Int,n2:Int) -> Int? {
guard n2 != 0 else {
print("0以外を入力してね")
return nil
}
return n1 / n2
}
メソッドの返り値の矢印の左側に throwsと書く
エラー処理にまずthorowと書きその右にenumで作ったエラー処理を書く returnがいらない
後は最初に例で紹介したやつと同じ感じ。
最初の例と見比べたらこう書くのねってのが分かってくると思います!
■do catchで処理しよう!
下記は不適切なメソッドの処理
tryつけなエラー
try!クラッシュする
try?nilを返すどんなエラーかわからない...
div(n1: 3, n2: 0) //tryつけないとエラー
try! div(n1: 3, n2: 0) //エラーでたらクラッシュさせる
try? div(n1: 3, n2: 0) //エラーならnil
■そこでdo Catchの出番!!
基本これ使って処理する。
catch let error as CalculationErrorで定数errorにenumで作ったエラー処理が入る。
それをswitch文で分ける。
どちらでもないエラーには print("other")を用意しとく。
do {
let r3 = try div(n1: 10, n2: 0)
print(r3)
} catch let error as CalculationError {
switch error {
case .divisionBYZero:
print("divisionBYZero")
case .unknown:
print("unknown")
}
}catch {
print("other")
}
//結果 divisionBYZeroがプリントされる。
//divisionBYZeroは0が入力されている時のエラーの言葉みたいなもの
エラー処理をユーザーに伝えたい時などに使う。