about 6 years ago

當運行過程中出現非預期或是沒有正確 output 時,會需要知道實際發生了什麼問題,
Error handling 便是提供了一個能知道錯誤原因的方法。

Error enum

所有的 error handling 都只能 handle 實作 Error protocol 的 enum。

enum MyError: Error {
 case errorA
 case errorB
 case errorC
}

透過 function 丟出 error

enum MyError: Error {
 case errorA
 case errorB
 case errorC
}

func myFunc(para: Int) throws {
    if para == 0 {
    throw MyError.errorA
  }
  else if para == 1 {
    throw MyError.errorB
  }
}

do try catch

在 function 前面加上 try 來 handle error,若沒有 throw error 會繼續走下去,
這裡有一個地方要注意,因為必須要 handle 到全部的 error,所以至少要有一個 default catch 情況,

enum MyError: Error {
 case errorA
 case errorB
 case errorC
}

func myFunc(para: Int) throws {
    if para == 0 {
    throw MyError.errorA
  }
  else if para == 1 {
    throw MyError.errorB
  }
}

do {
    try myFunc(para: 1)
  print("pass")
} catch MyError.errorA {
    print("a")
} catch MyError.errorB {
    print("b")
} catch {
    print("default")
}

Errors to optional

使用 try? 的話,若有 throw error,便會轉成 nil。

enum MyError: Error {
 case errorA
 case errorB
 case errorC
}

func myFunc(para: Int) throws {
    if para == 0 {
    throw MyError.errorA
  }
  else if para == 1 {
    throw MyError.errorB
  }
}
try? myFunc(para:1)

若肯定不會 throw error 可以使用 try!來處理。

enum MyError: Error {
 case errorA
 case errorB
 case errorC
}

func myFunc(para: Int) throws {
    if para == 0 {
    throw MyError.errorA
  }
  else if para == 1 {
    throw MyError.errorB
  }
}
try! myFunc(para:2)

defer

Defer 這個關鍵字能包起一個區段,這個區段會在 function 結束後才會被執行。

func myFunc() {
    defer {
    print("clean")
  }
  for index in 0...5 {
    print(index)
    if index == 0 {
        break
    }
  }
}
← iOS Swift : Optional Chaining iOS Swift : Type Casting & Nested Types →