Swift 中的異常處理(附帶與OC的對比)

1.用assert和precondition的方式來拋出錯誤信息

Swift中的assert的使用與OC中的NSAssert相似git

oc中的用法
- (void)assertfunction:(NSString *)email password :(NSString *)password {
    NSAssert(email.length < 8, @"invalid email");
    NSAssert(password.length < 8, @"invalid password");
}

複製代碼
swift中的用法
func assertfunction(email: String ,password: String) {
    assert(email.count < 8, "invalid email")
    assert(password.count < 8, "invalid password")
}
複製代碼

precondition爲Swift獨有(OC沒有),使用方式與assert同樣,第一個參數填寫判斷的條件第二個是messagegithub

precondition(condition: Bool, message: String)
複製代碼

Swift中precondition的做用與assert相似,最大的區別在於assert只能在debug模式下使用,而precondition在debug模式和Release模式下都可以起做用.swift

2. 使用try catch處理異常

先看一下OC中的try catchbash

- (void)trycatchfunction {
    @try {
        NSArray<NSString*> *list = @[];
        NSLog(@"list[1]===%@",list[1]);
    } @catch (NSException *exception) {
        NSLog(@"%@",exception.description);
    } @finally {
        
    }
}
複製代碼

oc中的try catch,會將try中的異常捕獲,而後會執行catch中的代碼,Swift中的try catch步驟要多一些分爲三步網絡

1. 使用枚舉定義異常值

enum RequestError :Error {//注意Swift的全部異常類型都繼承於Error。
    case netError
    case serviceError
    case missingParameter(parameter: String)
    case isnil
}
複製代碼

2. 拋出異常

func throwErrors(type :Int) throws -> String {//(使用關鍵字throws)
    if type == 1 {
        throw RequestError.netError
    }else if type == 2 {
        throw RequestError.serviceError
    }else if type == 3 {
        throw RequestError.missingParameter(parameter: "password")
    }
    return "success"
}
複製代碼

3.捕獲異常(catch)

do {
    try str = throwErrors(type: 2)
    
    //不報錯 下邊會輸出,報錯則不執行
    print(str)
    // let array : [Int] = []
    // 若是執行 print(array[2])程序會崩潰,swift中的try catch 只能捕獲事先定義好的異常,這點與OC有很大不一樣
} catch  {
    //報錯則執行相對應的錯誤類型
    
    switch error {//這裏要特別說明一下swift的error是異常,與OC中的NSError不是一回事,與OC中的NSException類似
    case RequestError.netError :
        print("是網絡錯誤")
    case RequestError.serviceError :
        print("是服務端錯誤")
    default:
        print("缺乏參數")
    }
}
複製代碼

固然發現有異常,你也能夠選擇不處理函數

func findOptionsError(value :String?) throws -> [String] {
    guard let value = value else {
        throw RequestError.isnil
    }
    return [value]
}

let value = try? findOptionsError(value: nil)//此處異常會返回一個nil


let crash = try! findOptionsError(value: nil)//此處會崩潰
複製代碼

try try? try!的區別 try : 執行函數後,若是有異常須要catch異常ui

try? :是可選性的執行,不報錯的時候返回正常的值.若是有異常會返回一個nil,程序不會奔潰.spa

try! :是強制解包,當拋出異常的時候也解包,致使崩潰問題。.net

相關的swift 代碼在 這裏.若是有疑問能夠看一下.debug

iOS的報錯和捕獲異常先說這麼多,若是有錯誤但願你們指出.歡迎評論.

相關文章
相關標籤/搜索