首页 > 解决方案 > Swift:无法使用关联数据捕获特定错误情况

问题描述

如果日期格式不正确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'."

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

标签: swiftexception-handlingjsondecoder

解决方案


DecodingError.dataCorruptedError(in:debugDescription:)是一个静态函数 over DecodingError,这个函数返回.dataCorrupted大小写。因此,您的 catch 语句应如下所示:

} catch DecodingError.dataCorrupted(let context) {

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


推荐阅读