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
}
}
}