Swift Error处理最佳实践

时间:2018-04-03 10:54:09

标签: swift error-handling try-catch alamofire

我习惯于使用典型的try catch块来处理任何函数或代码块的异常,例如目标C。

然而,在向Swift跳过信仰并阅读Swift的错误处理之后;这不是我所期待的。您必须通过抛出错误并保护并检查是否所有内容来处理您的异常。

我需要一般的Swift错误处理技巧和最佳实践,特别是对于以下情况:

  1. 我使用Alamofire来调用服务,它具有闭包,并通过另一个带闭包的函数调用它。 AFAIK我不能在异步代码中抛出错误,那么这种情况的最佳做法是什么? 将尝试使用代码示例进行更新

  2. 让app中的每个函数抛出错误是否有利?以防万一 ?比如检查每个值或结果。

  3. 我可以使用单例错误处理模块吗?

  4. 提前致谢

1 个答案:

答案 0 :(得分:2)

  

您必须通过抛出错误并保护并检查是否所有内容来处理您的异常。

这是一个不一定是真的假设。如果您的代码结构正确,则不必使用if letthrow来检查所有内容。

  

我需要一般的Swift错误处理技巧和最佳实践......

在您查看其他内容之前,请按顺序阅读以下页面。他们应该为您提供最佳实践的良好背景。

  1. Error Protocol Apple Developer Documentation
  2. Error Handling - Apple's Swift Programming Language Guide
  3. Magical Error Handling in Swift - Ray Wenderlich
  4.   

    我使用Alamofire来调用服务,它具有闭包,并通过另一个带闭包的函数调用它。 AFAIK我不能在异步代码中抛出错误,那么这种情况的最佳做法是什么?

    你可以。一个好的做法是将闭包作为参数传递给服务调用函数,然后在异步操作完成时调用闭包,如下所示:

    functionThatCallsAService(completion: @escaping (Data?, NetworkingErrors?) -> ()) {
        session.dataTask(with: request) { data, response, error in
            guard error == nil else {
                completion(nil, NetworkingErrors.returnedError(error!))
                return
            }
            completion(data, nil)
        }.resume()
    }
    
    enum NetworkingErrors: Error {
        case errorParsingJSON
        case noInternetConnection
        case dataReturnedNil
        case returnedError(Error)
        case invalidStatusCode(Int)
        case customError(String)
    }
    
      

    让app中的每个函数抛出错误是否有利?以防万一?比如检查每个值或结果。

    如果您确定某个函数或值不会为nil /导致运行时错误/抛出错误,那么请不要检查它!但一般来说,根据上面的网页,你应该检查调用Web服务,与文件系统交互,创建复杂对象等的nil和/或错误。

      

    我可以使用单例错误处理模块吗?

    你在技术上可以,但除了记录之外,我认为没有任何理由这样做。