swift异常处理 历史由来
- Swift1.0版本 Cocoa Touch 的 NSError ,Swift并没有真正的具备自己的异常处理机制
- Swift2.0版本 加入 ErrorType protocol
- Swift3.0版本 改名 Error protocol
Swift3.0 Error protocol 的使用
首先定义一个枚举,集成协议Error (Swift 2.0 的协议叫做ErrorType,3.0后协议改名Error)
1
2
3
4
5
|
enum MyError : Error {
case one
case two
case three
}
|
throws和throw的使用
使用throws放在参数列表后面标明一个方法有异常抛出,标准格式 : func 方法名字 (参数列表) throws -> 返回值类型
并在方法内使用throw抛出异常
1
2
3
4
5
6
7
8
9
10
11
12
|
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-catch处理异常
1
2
3
4
5
6
7
8
9
|
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.如果没有异常,则返回可选值.例子如下
1
2
3
4
5
|
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!后,在可能抛出异常的方法中抛出了异常,那么程序会立刻停止.例子如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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()