【问题标题】:Swift error handling - determining the error typeSwift 错误处理 - 确定错误类型
【发布时间】:2016-02-20 13:46:35
【问题描述】:

在 Swift 错误处理中 - 如何在不查看实现的情况下知道抛出了什么错误类型,以及如何处理方法可以抛出 ErrorType 派生错误和 NSError 的情况?

例如

代码没有显示会抛出什么类型的错误。

public func decode(jwt: String) throws -> JWT {
    return try DecodedJWT(jwt: jwt)
}

【问题讨论】:

标签: error-handling swift2


【解决方案1】:

您可以将抛出的错误捕获到变量并对该变量进行运行时分析。例如,对于一些未知的实现:

/* ---------------------- */
/* unknown implementation */
enum HiddenError: ErrorType {
    case SomeError
}

class AnotherError : NSError { }

func foo() throws -> Int {
    let foo = arc4random_uniform(3);
    if foo == 0 {
        throw HiddenError.SomeError
    }
    else if foo == 1 {
        throw AnotherError(domain: "foo", code: 0, userInfo: [:])
    }
    else if foo == 2 {
        throw NSError(domain: "foo", code: 0, userInfo: [:])
    }
    else {
        return Int(foo)
    }
}
/* ---------------------- */

调查错误为:

/* "External" investigation */
func bar() throws -> Int {
    return try foo()
}

func fuzz() {
    do {
        let buzz = try bar()
        print("Success: got \(buzz)")
    } catch let unknownError {
        print("Error: \(unknownError)")
        print("Error type: \(unknownError.dynamicType)")
        if let dispStyle = Mirror(reflecting: unknownError).displayStyle {
          print("Error type displaystyle: \(dispStyle)")
        }
    }
}

fuzz()
/* Output examples:

   Error: SomeError
   Error type: HiddenError
   Error type displaystyle: Enum

   //

   Error: Error Domain=foo Code=0 "(null)"
   Error type: AnotherError
   Error type displaystyle: Class

   //

   Error: Error Domain=foo Code=0 "(null)"
   Error type: NSError
   Error type displaystyle: Class             */

【讨论】:

  • 那么没有办法提前知道会抛出什么错误类型?
  • 如果您调用的 throwing 方法是一个黑盒(并且没有文档),那么您需要进行运行时自省来调查该方法可能抛出的错误类型。但是,通常情况并非如此,您可以将catch 子句与您预期要抛出的特定错误结合起来。还要注意,所有的错误都 conform 到 ErrorType (并且在 Swift 中抛出的错误必须是符合此的类型)。
猜你喜欢
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多