Swift错误处理 - 确定错误类型

时间:2016-02-20 13:46:35

标签: error-handling swift2

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

e.g。

代码不会显示将抛出的错误类型。

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

1 个答案:

答案 0 :(得分:3)

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

/* ---------------------- */
/* 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             */