Swift: не удается отловить конкретный случай ошибки со связанными данными - PullRequest
0 голосов
/ 06 февраля 2019

Я устанавливаю пользовательский 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 {

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'."

КонечноМне не хватает чего-то очень простого, но что?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

DecodingError.dataCorruptedError(in:debugDescription:) является статической функцией над DecodingError, и эта функция возвращает регистр .dataCorrupted.Таким образом, ваш оператор catch должен выглядеть следующим образом:

} catch DecodingError.dataCorrupted(let context) {

Вы должны быть в состоянии извлечь некоторую информацию из контекста, если вам нужно больше, вам может потребоваться выделенный тип ошибки.

0 голосов
/ 06 февраля 2019

Причина, по которой вы получаете ошибку "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: ()
    }
}
...