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) {
您应该能够从上下文中提取一些信息,如果您需要更多信息,那么您可能需要专门的错误类型。
我正在设置自定义 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) {
您应该能够从上下文中提取一些信息,如果您需要更多信息,那么您可能需要专门的错误类型。