Swift 中的正确错误处理

Posted

技术标签:

【中文标题】Swift 中的正确错误处理【英文标题】:Proper Error handling in Swift 【发布时间】:2014-07-08 16:33:21 【问题描述】:

大家好,*** 成员,

我非常努力地在 Swift 上做得更好,现在我遇到了一个小问题。我是一名前 C# 开发人员,所以到目前为止的错误处理都是 try ... catch ... Message... Done!

现在我正在开发一个使用一些 JSON API 的应用程序。一切正常,下载 JSON 数据,将它们打包到我的对象中,但有一个问题。正确的错误处理..

我有以下代码来下载和解析 JSON:

//Download & Parse JSON
func getJSON(urlToRequest: String) -> NSDictionary 

    var url: NSURL = NSURL(string: urlToRequest)
    var jsonRequest: NSURLRequest = NSURLRequest(URL: url)
    var jsonResponse: AutoreleasingUnsafePointer<NSURLResponse?> = nil

    var error: NSError?
    var dataValue: NSData =  NSURLConnection.sendSynchronousRequest(jsonRequest, returningResponse: jsonResponse, error:&error)

    if error.description.isEmpty 
        var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataValue, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary

        if error.description.isEmpty 
            return jsonResult
        
        else 
            return NSDictionary(object: "Error: Something with parsing went wrong :(", forKey: "error")
        
    
    else 
        return NSDictionary(object: "Error: There was an error with your connection :(", forKey: "error")
    

错误部分只是暂时的,问题是我的 ViewController 只调用了一个函数来获取一周的全部数据(天数、比赛等)

我这样称呼它:

var rWrapper = RiotWrapper()
let lcsWeek: Week = rWrapper.getWeek("2014-07-07")

我的 getWeek 方法调用了 3-4 个函数,它们都解析与先前响应相关的 JSON 数据。

好的,长话短说:如果 JSON 或 HTTP 失败,我想中止所有任务,并只用错误消息填充我的 TableView,我该如何实现?

类似:如果发生错误 -> 停止你正在做的任何事情 -> 例如返回一个 null erm.. nil for week -> 打印错误

有人可以帮助我吗?如果有人根据这个主题进行一些讲座,那也很好:D

提前致谢! 顺便说一句:对不起我的“坏”英语

【问题讨论】:

【参考方案1】:

您的所有 JSON 解析方法(包括 getWeek)都应该返回一个带有可选返回值和错误的元组。如果在任何时候您在 JSON 解析中的某个方法中出现错误,只需立即使用 nil 作为返回值返回错误。链上的每个方法都应检查先前方法的错误,如果发现错误,则立即返回错误:

func getWeek(string : String) -> (Week?, NSError) 
    let (result, error) = self.otherMethod()
    if error 
        return (nil, error)
    

    // continue happily ...

【讨论】:

【参考方案2】:

我建议让你的函数返回一个可选项。它易于测试,功能可以链接和快捷。

func getWeek(string : String) -> Week? 

...
if error 
  return nil


可以这样快速评估:

if let week = getWeek("2014-07-07")  
  // handle success case
 else 
  // handle nil

并在此处查看如何将许多返回可选的函数串在一起: https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html

【讨论】:

我现在就是这样做的,它就像魅力一样。一旦你弄清楚选项是如何工作的,只有一个词可以形容它......太棒了:D

以上是关于Swift 中的正确错误处理的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spotify SDK 和 Swift 3 正确处理令牌刷新。错误代码 = 3840

学习Swift -- 错误处理

Swift中的错误处理

Swift 2 中的显式老式错误处理

swift swift中的错误处理3

swift Swift中的错误处理示例