2
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)
4

1 回答 1

1

问题是你抛出了另一个错误,而不是消耗你的 age 方法抛出的错误:

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)
    }
}

或者,如果您更喜欢多个 catch 块:

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)
}
于 2019-07-06T13:05:39.170 回答