throws 和 rethrows 的用法与作用
Swift中 throws 和 rethrows 关键字用于异常处理(Error handling),都是用在函数中,可以简单理解为throws让函数或者方法可能出现的异常得到处理(比如用do-catch处理),而rethrows只是传递throws,函数本身不需要处理异常
- throws表示当前函数可能会抛出异常,需要处理
如果在方法中,想要同时返回正常值和错误,需要通过throw返回错误,并且在方法返回值的箭头前面加throws关键字,在调用方法时,还需要加上try关键字,或者使用do-catch - rethrows表示以闭包或函数作为参数可能出现异常,但当前函数调用者不需处理异常 rethrows只是传递参数中的异常,也就是不需要关键字。调用方法处理异常,得到的是传递的异常。
比如高阶函数中的map, transform这个闭包类型的参数可能出现异常,但map函数不需要调用者处理异常
func map<T>(@noescape transform: (Generator.Element) throws -> T) rethrows -> [T]
直接看可能不太明白,那么我写一段代码,你可能会更好理解
throws
enum TestError: Error {
case fail
case unknow
}
extension TestError: LocalizedError{
var errorDescription: String? {
switch self {
case .fail:
return "卧槽失败"
case .unknow:
return "老子也不知道什么类型"
}
}
}
//CustomNSError相当于NSError
extension TestError: CustomNSError{
var errorCode: Int{
switch self {
case .fail:
return 404
case .unknow:
return 504
}
}
}
func test(a: Any) throws -> String {
if type(of: a) == Int.self {
return "Int"
}
throw TestError.unknow
}
//let d = try test(a: 10.0)//向上甩锅
//let d = try! test(a: 10.0)//表示不会出现异常,出现就崩溃
//let d = try? test(a: 10.0)//返回可选类型,出现异常返回nil
//异常处理 do catch
do {
let d = try test(a: 10.0)
print(d)
} catch {
print(error.localizedDescription)
}
rethrows
// 闭包标记为throws
func testRethrow(testThrowCall: (Int) throws -> String, num: Int) rethrows -> String {
try testThrowCall(num)
}
//不处理异常
let str = testRethrow(testThrowCall: { (int) -> String in
return "\(int)"
}, num: 10)
print(str)
//处理异常
do {
let testResult: String = try testRethrow(testThrowCall: { (int) -> String in
return try test(a: 10.0)
}, num: 10)
print(testResult) // Will no print
} catch TestError.unknow {
print(TestError.unknow)
}
上面代码中实现了处理异常和不处理异常,throws标记的函数需要使用try
网友评论