Swift try try! try?使用和區別
一、異常處理try catch的使用
1. swift異常處理 歷史由來
- Swift1.0版本 Cocoa Touch 的 NSError ,Swift並沒有真正的具備自己的異常處理機制
- Swift2.0版本 加入 ErrorType protocol
- Swift3.0版本 改名 Error protocol
2. Swift3.0 Error protocol 的使用
首先定義一個枚舉,集成協議Error (Swift 2.0 的協議叫做ErrorType,3.0后協議改名Error)
enum MyError : Error {
case one
case two
case three
}
3. throws和throw的使用
使用throws放在參數列表后面標明一個方法有異常拋出,標准格式 : func 方法名字 (參數列表) throws -> 返回值類型 並在方法內使用throw拋出異常
func testFunc(str: String) throws -> String {
if str == "one" {
throw MyError.one
}else if str == "two" {
throw MyError.two
}else if str == "three" {
throw MyError.three
}
return "ok"
}
4. 使用do-catch處理異常
do {
var str = try testFunc(str: "three")
} catch MyError.one {
print("MyError.one")
} catch MyError.two {
print("MyError.two")
} catch let error as MyError {
print(error)
}
二、try?的使用
Swift2.0 后加入了新的關鍵字 try? , 如果不想處理異常那么可以用這個關鍵字,使用這個關鍵字返回一個可選值類型,如果有異常出現,返回nil.如果沒有異常,則返回可選值.例子如下
enum MyError : Error {
case one
case two
case three
}
func testFunc(str: String) throws -> String {
if str == "one" {
throw MyError.one
}else if str == "two" {
throw MyError.two
}else if str == "three" {
throw MyError.three
}
return "ok"
}
var str = try? testFunc(str: "three")
print(str)
控制台輸出
nil
Program ended with exit code: 0
三、try!的使用
如果不想處理異常,而且不想讓異常繼續傳播下去,可以使用try!.這有點兒類似NSAssert().但是一旦使用try!后,在可能拋出異常的方法中拋出了異常,那么程序會立刻停止.例子如下
enum MyError : Error {
case one
case two
case three
}
func testFunc(str: String) throws -> String {
if str == "one" {
throw MyError.one
}else if str == "two" {
throw MyError.two
}else if str == "three" {
throw MyError.three
}
return "ok"
}
var str = try! testFunc(str: "three")
控制台:程序奔潰掉~
四、try try? try! 的區別
- try 出現異常處理異常
- try? 不處理異常,返回一個可選值類型,出現異常返回nil
- try! 不讓異常繼續傳播,一旦出現異常程序停止,類似NSAssert()
