如何在闭包中抛出错误



我的函数:

func post(params: AnyObject, completion: (response : AnyObject ) -> Void) {

}

但我需要一些类似错误抛出内部完成块的东西

func post(params: AnyObject, completion: (response : **throws ->** AnyObject ) -> Void) {

}

以便我可以处理块本身内部的错误

这是一个小例子,说明如何在闭包中抛出错误。

首次设置错误枚举:

enum TestError : ErrorType {
    case EmptyName
    case EmptyEmail
}

你的函数应该抛出错误:

func loginUserWithUsername(username: String?, email: String?) throws -> String {
    guard let username = username where username.characters.count != 0 else {
        throw TestError.EmptyName
    }
    guard let email = email where email.characters.count != 0 else {
        throw TestError.EmptyEmail
    }
    return username
}

然后创建用于调用它的块:

func asynchronousWork(completion: (inner: () throws -> TestError) -> Void) -> Void {
    do {
        try loginUserWithUsername("test", email: "")
    } catch let error {
        completion(inner: {throw error})
    }
}

像这样处理错误:

asynchronousWork { (inner: () throws -> TestError) -> Void in
    do {
        let result = try inner()
    } catch TestError.EmptyName {
        print("empty name")
    } catch TestError.EmptyEmail {
        print("empty email")
    } catch {
        print(error)
    }
}

如果你想使用rethrows,这个代码示例取自这个链接:

enum NumberError:ErrorType {
    case ExceededInt32Max
}
func functionWithCallback(callback:(Int) throws -> Int) rethrows {
    try callback(Int(Int32.max)+1)
}
do {
    try functionWithCallback({v in if v <= Int(Int32.max) { return v }; throw NumberError.ExceededInt32Max})
}
catch NumberError.ExceededInt32Max {
    "Error: exceeds Int32 maximum"
}
catch {
}

相关内容

最新更新