【问题标题】:Is there a way to get the thrown error message using `try?` is Swift?有没有办法使用 `try?` 获取抛出的错误消息?是 Swift 吗?
【发布时间】:2019-08-12 19:48:37
【问题描述】:

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

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

是否可以使用try?访问error

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

【问题讨论】:

  • 不,这正是您通过说try? 丢弃的内容。如果您不想丢失错误,请不要这样做。
  • 不,当您不关心引发的实际错误时,您使用try?。结果要么为 nil,无论发生何种错误,您都以相同的方式处理错误,或者它不是 nil,因为没有引发错误。
  • @danielhadar 我不确定,我认为这是一个相当不错的问题。我唯一要更改的是添加您要尝试解决的问题。你只是为了满足好奇心吗? do/catch 有一些您试图通过使用guard 来减轻的不愉快后果,还有其他原因吗?等等
  • @Alexanderdo-catchtry?的区别在于,首先,使用data的代码也应该设置在do块内(或者在外面定义var data: Data,但是 eww)。
  • @danielhadar 如果catch 块以其他方式返回或破坏范围(无论如何,在guardelse 语句中是必需的),那么Swift 明确的初始化逻辑可以处理那个。声明数据为let data: Data,在do块中赋值,在catch块中退出作用域,在catch之后可以访问data

标签: swift error-handling try-catch


【解决方案1】:

不。 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!) }

【讨论】:

    【解决方案2】:

    根据The Swift Programming Language

    您使用try? 将错误转换为optional 值来处理错误。 如果在计算 try? 表达式时抛出错误,则值 表达式为nil

    所以现在的答案是。但是 Swift 社区中有一些提案要求提供 guard/catch 功能,以后可能会提供。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      相关资源
      最近更新 更多