最佳答案
在搜索了一些参考文献以找出答案之后,-不幸的是-我找不到关于理解 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
时,它必须由一个 try
来处理,这与 rethrows
不同。那又怎样!在决定使用 throws
或 rethrows
时,我们应该遵循什么逻辑?