我设置的是抛出一个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'."
当然我想的东西很简单,但什么?
DecodingError.dataCorruptedError(in:debugDescription:)
超过DecodingError
静态函数,这个函数返回.dataCorrupted
情况。因此,你catch语句应该是这样的:
} catch DecodingError.dataCorrupted(let context) {
您应该能够从上下文中提取一些信息,如果你需要更多,那么你可能需要一个专门类型的错误。
你之所以越来越"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: ()
}
}