【问题标题】:Errors Enum - common parameters for cases错误枚举 - 案例的常用参数
【发布时间】:2018-11-15 14:14:48
【问题描述】:

我的应用程序中有示例错误枚举:

public enum APIError: Error {
    case IncorrectArguments(message: String)
    case MissingArgument(message: String)
}

错误处理如下:

do {
    return try next.respond(to: request)
} catch let error as APIError {
    throw Abort(.badRequest, reason: error.message)
}

但我在这里遇到编译错误:Value of type 'APIError' has no member 'message'

我知道我可以通过模式匹配获取参数,但我不想以完全相同的方式处理每种情况:

do {
    return try next.respond(to: request)
} catch APIError.MissingArgument(let message) {
    throw Abort(.badRequest, reason: message)
} catch APIError.IncorrectArguments(let message) {
    throw Abort(.badRequest, reason: message)
}

将来枚举中可能会有更多 APIErrors,我不想使用单独的 catch 块来处理每个错误,因为每个人都会完全一样。

有没有办法以某种通用方式处理这些错误?

【问题讨论】:

  • 您在 catch 中抛出错误。您想在函数中抛出错误并在 Do..Catch 中捕获它
  • throw Abort 是 Vapor 以给定状态和消息返回响应的方式。
  • @Blejwi 检查我的答案。

标签: swift error-handling


【解决方案1】:

您可以像这样在枚举上定义计算属性:

public enum APIError: Error {
    case IncorrectArguments(message: String)
    case MissingArgument(message: String)

    var message: String {
        switch self {
            case .IncorrectArguments(let message): return message
            case .MissingArgument(let message): return message
        }
    }
}

然后像这样从你的 catch clouser 调用消息计算属性:

do {
    return try next.respond(to: request)
} catch let error as APIError {
    throw Abort(.badRequest, reason: error.message)
}

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多