首先定义一个枚举,集成协议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")
控制台:程序奔溃掉~程序