我正在设置一个自定义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")
    }
}

但是,我似乎无法为这种特定的catch类型编写DecodingError子句。我试过了
} catch DecodingError.dataCorruptedError(let container, let debugDescription) {


} catch DecodingError.dataCorruptedError(_, _) {

两种状态都是"Argument labels '(_:, _:)' do not match any available overloads."
把相关的数据都漏掉,比如
} catch DecodingError.dataCorruptedError {

"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'."
当然我错过了一些很简单的东西,但是什么?

最佳答案

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

} catch DecodingError.dataCorrupted(let context) {

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

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

10-09 07:33