
- 在Swift中
Error是一個(gè)協(xié)議,只有在遵循Error協(xié)議以后才能使用throw來拋出一個(gè)錯(cuò)誤
enum nameErrorType: Error {
case nilError
case unknowError
}
- 創(chuàng)建一個(gè)拋錯(cuò)的函數(shù)(使用
throws來表示一個(gè)可以拋出錯(cuò)誤的函數(shù))
//使用 `throws` 來表示一個(gè)可以拋出錯(cuò)誤的函數(shù)
func nameCheck (_ name: String) throws -> String{
if name == "NULL" {
throw nameErrorType.nilError
}
return name
}
3.錯(cuò)誤處理
- 在Swift中一般錯(cuò)誤處理使用
do-catch,在do代碼塊中使用try來標(biāo)記代碼塊
func errorTest() {
do {
let str = try nameCheck("NULL")
print(str)
} catch {
print("nil error , Name is NULL!", error)
}
}
- 可以使用多個(gè)
catch塊來處理錯(cuò)誤。類似switch的處理。(最后加入一個(gè)空的catch,用于關(guān)閉catch)
func errorTest() {
do {
let str = try nameCheck("NULL")
print(str)
} catch nameErrorType.nilError{
print("nil error , Name is NULL!")
} catch nameErrorType.unknowError{
print("unknow error")
} catch{
//加入一個(gè)空的catch,用于關(guān)閉catch
}
}
- 使用
try?將錯(cuò)誤處理結(jié)果轉(zhuǎn)換為可選的,即函數(shù)如果是拋錯(cuò)那么返回值為nil
let str = try? nameCheck("NULL")
-
defer的使用
-
defer代碼塊表示在函數(shù)返回前,函數(shù)中最后執(zhí)行的代碼,從以下方法可以看出defer代碼塊的作用
func deferCheck() {
print("1")
defer{
print("3")
}
print("2")
}
//輸出結(jié)果為
//1
//2
//3
- 所以在錯(cuò)誤處理中我們經(jīng)常會(huì)用到defer來處理一些我們無論如何都需要運(yùn)行的功能
func errorTest() {
defer{
print("check over")
}
do {
let str = try nameCheck("NULL")
print(str)
} catch nameErrorType.nilError {
print("nil error , Name is NULL!")
} catch nameErrorType.unknowError{
print("unknow error")
} catch{
//加入一個(gè)空的catch,用于關(guān)閉catch。否則會(huì)報(bào)錯(cuò):Errors thrown from here are not handled because the enclosing catch is not exhaustive
}
}
//輸出結(jié)果
//nil error , Name is NULL!
//check over