经过寻找一些参考的数字出来,-unfortunately-我找不到任何关于理解之间的差异有用-和简单- 描述throws和rethrows。当试图了解我们应该如何使用它们时,这有点令人困惑。
throws
rethrows
我要说的是,我对-default-最为熟悉,它throws具有传播错误的最简单形式,如下所示:
enum CustomError: Error { case potato case tomato } func throwCustomError(_ string: String) throws { if string.lowercased().trimmingCharacters(in: .whitespaces) == "potato" { throw CustomError.potato } if string.lowercased().trimmingCharacters(in: .whitespaces) == "tomato" { throw CustomError.tomato } } do { try throwCustomError("potato") } catch let error as CustomError { switch error { case .potato: print("potatos catched") // potatos catched case .tomato: print("tomato catched") } }
到目前为止还不错,但是在以下情况下会出现问题:
func throwCustomError(function:(String) throws -> ()) throws { try function("throws string") } func rethrowCustomError(function:(String) throws -> ()) rethrows { try function("rethrows string") } rethrowCustomError { string in print(string) // rethrows string } try throwCustomError { string in print(string) // throws string }
到目前为止我所知道的是当调用一个函数时throws必须由a处理try,与rethrows。所以呢?!在决定使用throws或时应遵循的逻辑是什么rethrows?
try
从“声明”在斯威夫特书:
重投功能和方法 可以使用rethrows关键字声明函数或方法,以表明仅当函数的一个函数参数抛出错误时,该函数或方法才会抛出错误。这些功能和方法称为 重新抛出函数 和 重新抛出方法 。抛出函数和方法必须至少具有一个抛出函数参数。
重投功能和方法
可以使用rethrows关键字声明函数或方法,以表明仅当函数的一个函数参数抛出错误时,该函数或方法才会抛出错误。这些功能和方法称为 重新抛出函数 和 重新抛出方法 。抛出函数和方法必须至少具有一个抛出函数参数。
一个典型的例子是map方法:
map
public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
如果map使用非抛出转换调用if ,则它本身不会抛出错误,并且可以在没有以下情况的情况下调用try:
// Example 1: let a = [1, 2, 3] func f1(n: Int) -> Int { return n * n } let a1 = a.map(f1)
但是,如果map使用throwing闭包调用,则本身可以抛出,必须使用调用try:
// Example 2: let a = [1, 2, 3] enum CustomError: Error { case illegalArgument } func f2(n: Int) throws -> Int { guard n >= 0 else { throw CustomError.illegalArgument } return n*n } do { let a2 = try a.map(f2) } catch { // ... }
throws/rethrows
同样是从雨燕标准库的其它方法取功能参数真:filter(),index(where:),forEach()和许多许多。
filter()
index(where:)
forEach()
就你而言
func throwCustomError(function:(String) throws -> ()) throws
表示即使使用非抛出参数调用也可能抛出错误的函数,而
func rethrowCustomError(function:(String) throws -> ()) rethrows
表示仅当使用throwing参数调用时才会引发错误的函数。
粗略地说,rethrows是针对那些不会“独自”抛出错误,而仅从其函数参数中“转发”错误的函数。