1簡介
(1)swift語言提供錯誤處理機制,可以在程序運行任何位置,捕獲錯誤。
(2)流程:先將錯誤拋出--傳輸--處理--如果出現處理不了的就直接反饋給用戶
(3)swift語言中提供了一種空協議ErrorType,遵守協議的值就是錯誤信息的反饋,通常情況下建議使用枚舉遵守協議,枚舉中的成員代表不同的錯誤信息。而且枚舉成員可以攜帶額外值,對錯誤信息描述會更加具體。
(4)遵守協議的枚舉是自定義的,錯誤信息也是自定義的。
2分類
1:將錯誤信息拋給調用函數,由調用函數傳遞錯誤
2:使用swift提供的函數do-catch對錯誤信息進行捕獲和處理
3:將錯誤信息賦給一個可選類型,將錯誤信息轉換成nil
4:錯誤異常,直接斷言此處一定不會出錯誤,即使出現錯誤也不拋出
程序示例如下:
//判斷年齡是否在18~60歲之間,如果不在,拋出異常/錯誤
enum AgeError: ErrorType{
case tooOld
case tooYoung(age: Int)
}
//1:如果函數能夠時刻捕獲/得到錯誤并拋出,函數后面添加關鍵字throws
//throws修飾的函數被稱為throwing型函數,能夠拋出錯誤的函數
//如果函數帶有返回值,返回值就寫在 throws->返回值類型
//guard...(只有判斷條件,沒有語句塊)else...用于判斷,比if...else...快
func getAde(age: Int)throws{
guard age >= 18 else{
//throw顯示拋出錯誤,立即執行
throw AgeError.tooYoung(age: age)
}
guard age <= 60 else{
throw AgeError.tooOld
}
}
//接收throws拋出的異常,try關鍵字傳輸
try getAde(50)
//2:需要捕獲異常 使用do-catch函數 在do中捕獲異常 和catch后面的條件進行比較 當條件滿足的使用 就會對異常進行處理
do {
try getAge(100)
}catch AgeError.TooOld {
print("年齡太大")
}catch AgeError.TooYoung(var age) {
print("年齡太小 = \(age)")
}
//do-catch的作用就是錯誤進行捕獲 不拋出 避免程序崩潰
do {
try getAge(1)
}catch {
print("出現錯誤")
}
//3:將錯誤信息直接賦給可選類型
func getString(string: String)throws -> Int {
if string.characters.count < 3 || string.characters.count > 10 {
//調用OC類中的錯誤處理 類名就是NSError
throw NSError.init(domain: "字符串輸入格式不符", code: 0, userInfo: nil)
}
return string.characters.count
}
let r1 = try? getString("12")
print(r1)
let r2 = try? getString("123456")
print(r2!)
//try? 接收拋出的異常 如果異常存在 直接將異常轉換成nil 如果異常不存在 返回的只需要強制解析
//4:錯誤異常
//try! 不傳輸錯誤(異常) do-catch也不能捕獲錯誤
do{
try! getString("103")
} catch{
print("123456789")
}
3總結
1、如果函數需要拋出異常 必須使用throws修飾
2、throw 用于立即拋出異常
3、do-catch 和try連用 捕獲try傳輸的異常 catch語句塊解決 但是與try!連用 不能捕獲到任何異常
4、try? 將捕獲的異常賦給可選類型 如果出錯將錯誤轉化成nil