有没有一种方法可以使用`try?`获取引发的错误消息?

时间:2019-08-12 19:48:37

标签: swift error-handling try-catch

使用do-catchcatch块中返回抛出的错误消息:

do {
  data = try Data(contentsOf: url)
} catch {
  print(error) // Using `error`
}

是否可以使用error访问try?

guard let data = try? Data(contentsOf: url) else { /* access error here */ }

2 个答案:

答案 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 功能,以后可能会提供。