首先定義一個枚舉,集成協議Error (Swift 2.0 的協議叫作ErrorType,3.0後協議更名Error)swift
enum MyError : Error { case one case two case three }
使用throws放在參數列表後面標明一個方法有異常拋出,標準格式 : func 方法名字 (參數列表) throws -> 返回值類型
並在方法內使用throw拋出異常code
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" }
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) }
Swift2.0 後加入了新的關鍵字 try?
, 若是不想處理異常那麼能夠用這個關鍵字,使用這個關鍵字返回一個可選值類型,若是有異常出現,返回nil.若是沒有異常,則返回可選值.例子以下three
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)
控制檯輸出it
nil Program ended with exit code: 0
若是不想處理異常,並且不想讓異常繼續傳播下去,可使用try!.這有點兒相似NSAssert().可是一旦使用try!後,在可能拋出異常的方法中拋出了異常,那麼程序會馬上中止.例子以下test
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")
控制檯:程序奔潰掉~程序