Использование 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{} имеет несколько вызовов, которые вызывают генерацию ошибок, мне может потребоваться по-разному обрабатывать ошибки, вызываемые этими методами. Шаблон, который я пытаюсь реализовать, выглядит так... где decodingError(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, который, кажется, удовлетворяет всем случаям перечисления (по крайней мере, он компилируется)
} catch is DecodingError {
но компилятор, похоже, не автоматически привязывает переменную «ошибка», и я не вижу такой опции, как
} catch let decodingError is DecodingError { // THIS IS NOT VALID
Если я просто перехватываю все ошибки, я могу легко получить переключатель в центральном методе, который соответствующим образом разделяет различные случаи ошибок декодирования. Но я хочу иметь возможность избежать отправки ошибок, не связанных с декодированием, в этот коммутатор. Я также могу разделить свои блоки do{}, чтобы выполнять в них только шаги декодирования, но это также делает код беспорядочным, особенно если вы декодируете несколько сообщений, чередующихся с другими действиями.
Предложения? Спасибо всем!