【问题标题】:Swift Error handling best practicesSwift 错误处理最佳实践
【发布时间】:2018-09-12 16:11:17
【问题描述】:

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

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

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

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

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

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

提前致谢

【问题讨论】:

  • must handle your exceptions by throwing errors 不,Swift 会抛出并捕获错误,但它不会捕获异常。这是两个不同的东西。小心不要混淆它们。
  • 是的,但我的意思是前任;我有我的 var 必须从服务中获得价值,如果我按原样使用它会抛出异常,在这种情况下我必须处理它并发送到其他函数错误代码,或者我认为
  • 你的变量不会抛出异常。 Swift 根本不处理异常。它不会抛出异常,也不会捕获异常。
  • 好的,我明白了。谢谢@Moritz

标签: swift error-handling try-catch alamofire


【解决方案1】:

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

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


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

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

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

我使用 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)
}

让应用程序中的每个函数都抛出错误是否有利?以防万一?就像检查每个值或结果一样。

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


我可以有一个单例错误处理模块吗?

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

【讨论】:

  • 谢谢亚伦。如果发生任何事情,我会阅读它们并回来
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 2019-10-28
  • 2011-03-26
  • 1970-01-01
相关资源
最近更新 更多