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

Swift: Can't catch specific error case with associated data

我正在设置自定义 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(_, _) {

两者都表明 "Argument labels '(_:, _:)' do not match any available overloads."

完全忽略相关数据,例如

} catch DecodingError.dataCorruptedError {

barfs 与 "Expression pattern of type '_' cannot match values of type 'Error'."

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

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

但这也无法编译,说明 "Pattern cannot match values of type 'DecodingError'."

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

您收到 "Pattern cannot match values of type 'DecodingError'." 错误(和其他错误)的原因是 .dataCorruptedError(_, _) 不是枚举大小写而是静态函数:

public static func dataCorruptedError(in container: UnkeyedDecodingContainer, debugDescription: String) -> DecodingError

要处理 switch 中的 DataCorrupted 错误,您需要为其使用可用的枚举大小写,例如:

catch let error as DecodingError {
    switch error {
    case .dataCorrupted:
        debugPrint("Data corrupted Custom Message")
    default: ()
    }
}

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

} catch DecodingError.dataCorrupted(let context) {

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