Swift:无法捕获具有关联数据的特定错误情况

标签 swift exception jsondecoder

我正在设置一个自定义 JSONDecoder.dateDecodingStrategy,如果日期格式不正确,它会抛出一个 DecodingError.dataCorruptedError:

decoder.dateDecodingStrategy = .custom { (decoder) -> Date in
    let container = try decoder.singleValueContainer()
    let dateString = try container.decode(String.self)
    let date = /* do magic date manipulation here */

    if let date = date {
        return date
    } else {
        throw DecodingError.dataCorruptedError(in: container,
                                               debugDescription: "foo")
    }
}

但是,我似乎无法为这个特定的 DecodingError 类型编写一个 catch 子句。我试过了

} catch DecodingError.dataCorruptedError(let container, let debugDescription) {

} catch DecodingError.dataCorruptedError(_, _) {

两者都声明“参数标签'(_:, _:)'不匹配任何可用的重载。”

完全忽略相关数据,例如

} catch DecodingError.dataCorruptedError {

barfs with “‘_’类型的表达式模式无法匹配‘Error’类型的值。”

所以我尝试了一个不同的策略,即

} catch let error as DecodingError {
    switch error {
    case .dataCorruptedError(_, _):

但这也无法编译,声明 “Pattern cannot match values of type 'DecodingError'.”

当然我错过了一些非常简单的东西,但是什么?

最佳答案

DecodingError.dataCorruptedError(in:debugDescription:)DecodingError 的静态函数,该函数返回 .dataCorrupted 的情况。因此,您的 catch 语句应如下所示:

} catch DecodingError.dataCorrupted(let context) {

您应该能够从上下文中提取一些信息,如果您需要更多信息,那么您可能需要一种专用的错误类型。

关于Swift:无法捕获具有关联数据的特定错误情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54546829/

相关文章:

ios - GameCenter 与 SpriteKit 集成

ios - 在 iOS Swift 中将自定义字体设置为 UILabel

swift - 在 UILabel Swift 顶部添加图像

django - 如何查看 channel 消费者引发的异常

ios - JSONDecoder - "Expected to decode Dictionary<String, Any> but found a string/data instead."

json - 如何在 Swift 中解码命名的 json 对象数组

ios - 点击 UILabel 的一部分文本

exception - 谷歌云函数 "[ERROR]: Exception on/[POST]"

ios - 带有嵌套数据的 Swift 4 JSON 解码器

java - Spring MVC : Not able to use use validator, 获取 "Injection of autowired dependencies failed"