gpt4 book ai didi

Swift 错误处理最佳实践

转载 作者:搜寻专家 更新时间:2023-11-01 07:03:29 26 4
gpt4 key购买 nike

我习惯使用典型的 try catch block 来处理任何函数或代码块(如 objective-c )的异常。

然而,在对 Swift 产生信心并阅读了 Swift 的错误处理之后;这不是我所期望的。您必须通过抛出错误和保护并检查是否还有所有内容来处理您的异常。

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

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

  2. 让应用中的每个功能都抛出错误是否有利?以防万一 ?就像检查每一个值或结果。

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

提前致谢

最佳答案

You must handle your exceptions by throwing errors and guard and checking if else everything.

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


I need general Swift error handling tips and best practices ...

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

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

Im using Alamofire for calling services, which has closure, and calling it through another function with closure too. AFAIK I can’t throw error inside async code, so what is best practice for such case?

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

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)
}

Is it favourable to have every function in the app throw errors? Just in case? Like checking every single value or result.

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


Can I have a Singleton Error handling module?

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

关于Swift 错误处理最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49628288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com