Как получить правильную ошибку при нажатии на блок do catch для функции, которая выдает, когда String не соответствует Error? - PullRequest
2 голосов
/ 06 июля 2019
import Foundation

enum ErrorScenarios: Error {
    case invalidAge
    case invalidEmail
    case incorrectData
}

func age(age:Int) throws {
    if age < 20 {
        throw ErrorScenarios.invalidAge
    }
    print("You have a valid age of \(age)")
}

extension ErrorScenarios: LocalizedError {
    var localizedDescription: String {
        switch self {
        case .incorrectData:
            return "Incorrect data provided"
        case .invalidAge:
            return "Incorrect age was provided"
        case .invalidEmail:
            return "Incorrect email provided"
        }
    }
}

Здесь я использую блок do catch для отлова сценария ошибки invalidAge, я не совсем уверен, что это правильно?Когда я запускаю игровую площадку, блок catch никогда не получает удар.

do {
    try age(age: -23)
}
catch {
    throw ErrorScenarios.invalidAge
}

Здесь, в качестве альтернативы блоку do catch, я имею дело с ошибкой, делая ее необязательной, поэтому я предполагаю, что блок do catchне требуется.Однако при печати результата он возвращает Optional ((), а не необязательный Int. Любая помощь будет полезна, если я ошибаюсь.

let result = try? age(age: 34)
print(result)

1 Ответ

1 голос
/ 06 июля 2019

Проблема в том, что вы выдаваете другую ошибку вместо использования той, которая выдается вашим методом возраста:

do {
    try age(age: -23)
} catch {
    if let error = error as? ErrorScenarios {
        print("ErrorScenarios:", error)  // "ErrorScenarios: Incorrect age was provided\n"
        switch error {
        case .incorrectData:
            print("invalidAge")
             case .invalidAge:
            print("invalidAge")   // "invalidAge\n"
             case .invalidEmail:
            print("invalidEmail")
        }
    } else {
        print("Error:", error)
    }
}

Или, если вы предпочитаете несколько блоков перехвата:

do {
    try age(age: -23)
} catch let error as ErrorScenarios {
    print("ErrorScenarios:", error)
    switch error {
    case .incorrectData:
        print("invalidAge")
    case .invalidAge:
        print("invalidAge")
    case .invalidEmail:
        print("invalidEmail")
    }
} catch {
    print("Error:", error)
}
...