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 中的正确错误处理的主要内容,如果未能解决你的问题,请参考以下文章