使用 Swift 4.2 和 XCode 10
在 Swift 4.2 中,DecodingError 是一个枚举。(目前)有四种不同的情况。我可以分别捕获每种情况,并绑定可用于记录错误的变量,如下面的代码...
do {
let model = try jsonDecoder.decode(BattleShip.self, from: jsonData!)
print(model)
} catch DecodingError.dataCorrupted(let context) {
print(context.debugDescription)
} catch DecodingError.keyNotFound(let key, let context) {
print("\(key.stringValue) was not found, \(context.debugDescription)")
} catch DecodingError.typeMismatch(let type, let context) {
print("\(type) was expected, \(context.debugDescription)")
} catch DecodingError.valueNotFound(let type, let context) {
print("no value was found for \(type), \(context.debugDescription)")
} catch {
print("I know not this error")
}
但这是很多代码放在我可能遇到解码错误的任何地方。而且,如果我的 do{} 块有多个抛出的调用,我可能需要处理这些方法以不同方式调用的错误。我试图实现的模式看起来像这样......其中 decoderError(error) 有上面所有的凌乱代码
do {
let object1 = try decoder.decode(SomeClass.self, from: someData)
try object2.methodThatThrowsSomeOtherError()
} catch <all decoding errors> { // this is invalid pseudocode
MyCentralLogger.log.decodingError(error)
} catch let nonDecodingError {
MyCentralLogger.log.error(nonDecodingError)
}
我可以有一个像这样的捕获模式,它似乎满足所有枚举案例(至少它编译)
} catch is DecodingError {
但编译器似乎没有自动绑定“错误”变量,而且我没有看到任何类似的选项
} catch let decodingError is DecodingError { // THIS IS NOT VALID
如果我只是捕获所有错误,我可以轻松地在中央方法中进行切换,以适当地分离不同的解码错误情况。但我希望能够避免将非解码错误发送到该开关。我还可以将我的 do{} 块分开,这样我就只在其中执行解码步骤,但这也会使代码变得混乱,尤其是当您要解码散布在其他操作中的多条消息时。
建议?谢谢大家!