使用do-catch
在catch
块中返回抛出的错误消息:
do {
data = try Data(contentsOf: url)
} catch {
print(error) // Using `error`
}
是否可以使用error
访问try?
:
guard let data = try? Data(contentsOf: url) else { /* access error here */ }
答案 0 :(得分:2)
不。 try?
显式地将其转换为可选的,从而丢失了错误对象。
您可以使用Result
类型来尝试实现目标语法,但是很快您就会清楚地知道原始代码是最好的:
extension Result {
var payload: Success? {
switch self {
case .success(let payload): return payload
case .failure(_): return nil
}
}
var error: Failure? {
switch self {
case .success(_): return nil
case .failure(let error): return error
}
}
}
let result = Result(catching: { Data(contentsOf: url) })
guard let data = result.payload else { print(result.error!) }
答案 1 :(得分:1)
根据 The Swift Programming Language :
您使用
try?
通过将错误转换为optional
值来处理错误。 如果在评估try?
表达式时抛出错误,则该值 表达式的nil
。
因此,现在的答案是否。但是Swift社区中有一些建议要求 guard / catch 功能,以后可能会提供。