斯威夫特:无法赶上与相关数据的特定错误的情况下

问题描述 投票:0回答:2

我设置的是抛出一个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'." barfs

于是,我尝试了不同的策略,即

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

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

当然我想的东西很简单,但什么?

swift exception-handling jsondecoder
2个回答
1
投票

DecodingError.dataCorruptedError(in:debugDescription:)超过DecodingError静态函数,这个函数返回.dataCorrupted情况。因此,你catch语句应该是这样的:

} catch DecodingError.dataCorrupted(let context) {

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


0
投票

你之所以越来越"Pattern cannot match values of type 'DecodingError'."错误(及其他)是,.dataCorruptedError(_, _)不枚举情况,但静态函数:

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

为了处理DataCorrupted你需要使用可枚举的情况下呢,比如像switch错误:

catch let error as DecodingError {
    switch error {
    case .dataCorrupted:
        debugPrint("Data corrupted Custom Message")
    default: ()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.