Swift错误处理最佳实践

4

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

然而,在跳入Swift并阅读有关Swift错误处理的内容后,它并不是我所期望的。您必须通过抛出错误和使用guard检查每个if else语句来处理异常。

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

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

  2. 是否有利于应用程序中的每个函数都抛出错误?以防万一?比如检查每个单独的值或结果。

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

提前感谢


“必须通过抛出错误来处理异常”,不对。Swift 通过抛出和捕获错误来处理错误,但它不会捕获异常。这是两个不同的概念,请小心不要混淆。” - Eric Aya
好的,但我的意思是举个例子;我有一个变量必须从服务中获取值,如果我直接使用它,会抛出异常,在这种情况下,我必须处理它并将错误代码发送到其他函数,或者我认为是这样。 - Masashi
你的变量不会抛出异常。Swift根本不处理异常。它既不抛出异常,也不捕获异常。 - Eric Aya
好的,我明白了。谢谢 @Moritz - Masashi
2个回答

4

您必须通过抛出错误并进行守卫和检查来处理异常。

这是一个可能不正确的假设。如果您的代码结构正确,您不应该使用if letthrow来检查所有内容。


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

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

  1. Error协议 Apple开发者文档
  2. 错误处理 - 苹果的Swift编程语言指南
  3. Swift中的神奇错误处理 - Ray Wenderlich

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

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

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和/或错误。


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

从技术上讲,你可以拥有一个,但除了记录日志外,我没有看到任何理由这样做。


1
谢谢Aaron。我会阅读它们,如果有任何问题发生,我会回来的。 - Masashi

0
enum CheckValidAge : Error{
    case overrage
    case underage
}

func checkValidAgeForGovernmentJob(age:Int)throws -> Bool{
    if age < 18{
        throw CheckValidAge.underage
    }else  if age > 25{
        throw  CheckValidAge.overrage
    }else{
        return true
    }
}

do {
    try checkValidAgeForGovernmentJob(age: 17)
    print("You are valid for government job ")
}catch CheckValidAge.underage{
    print("You are underage for government job ")
}catch CheckValidAge.overrage{
    print("You are overrage for government job ")
}

尝试调用 checkValidAgeForGovernmentJob(age: 17) 输出:您的年龄未达到政府工作的要求。

尝试调用 checkValidAgeForGovernmentJob(age: 26) 输出:您的年龄超过政府工作的要求。

尝试调用 checkValidAgeForGovernmentJob(age: 18) 输出:您符合政府工作的要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接