Swift中throw
和rethrows
关键字用于异常处理(Error handling),都是用在函数中,可以简单理解为throw让函数或者方法可能出现的异常得到处理(比如用do-catch处理),而rethrows只是传递throw,本身没有针对函数或方法,下面详细解释一下:
1、throw
首先用在函数申明中,放在返回类型的前面
,比如标准库中map的函数签名
//这里在map的函数参数中使用了throw,当元素小于0时抛出异常
enum NegativeError: Error {
case negative
}
let nums = [-1, 1, 2, 3, 4]
do {
let strNums = try nums.map { (num) throws -> String in
if num >= 0 {
return String(num)
} else {
throw NegativeError.negative
}
}
print(strNums) // Will no print
} catch let err {
print(err) //negative
}
enum TestError: Error {
case errorOne(Int)
case errorTwo(String)
case errorThree
case errorUnknown
}
func testThrow(num: Int) throws -> String {
switch num {
case 1:
throw TestError.errorOne(1)
case 2:
throw TestError.errorTwo("2")
case 3:
throw TestError.errorThree
case 4:
throw TestError.errorUnknown
default:
return "No Error"
}
}
do {
let testResult: String = try testThrow(num: 1)
print("0" + testResult) // Will no print
} catch let TestError.errorOne(num) {
print("1 \(num)") // 1
} catch let TestError.errorTwo(str) {
print("2" + str) // 2
} catch TestError.errorThree {
print("3 \(TestError.errorThree)") // errorThree
} catch let err {
print("4 \(err)") // errorUnknown
}
2、rethrows
只起到传递异常的作用
,在一个函数或者方法中,调用一个会throw的函数,就可以通过rethrows传递可能的异常,接上面的例子
func testRethrow(testThrowCall: (Int) throws -> String, num: Int) rethrows -> String {
try testThrowCall(num)
}
do {
let testResult: String = try testRethrow(testThrowCall: testThrow(num:), num: 3)
print(testResult) // Will no print
} catch let TestError.errorOne(num) {
print(num) // 1
} catch let TestError.errorTwo(str) {
print(str) // 2
} catch TestError.errorThree {
print(TestError.errorThree) // errorThree
} catch let err {
print(err) // errorUnknown
}
网友评论