Swift没有异常处理,遇到功能性错误怎么办?

更新时间:2015-02-25 10:17:50点击次数:2104次

摘要:在Swift中没有异常处理或抛出,当你编写库的代码执行了一个失败的子程序,且解析可选类型太麻烦时,你打算怎么做?文章作者所遵循的思想一直是想要保持Swift代码的干净整洁,所以都尽可能的避免对可选类型的使用。


在Swift中没有异常处理或抛出,如果不能像Java一样使用异常控制流结构,那当你编写库的代码执行了一个失败的子程序,且发现解析可选类型(Unwrapping Optionals)太麻烦时,你打算怎么做?我所遵循的一直是想要保持Swift代码的干净整洁,所以都尽可能的避免对可选类型(Optionals)的使用,同时还要维护它们传达错误操作的目的。


近,Colin Eberhardt指出不抛出异常会让嵌套解析条件(Unwrapping Conditionals)的代码变得杂乱:


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

if let a = a {  

  if let b = b {  

    if let c = c {  

      println("\(a) - \(b) - \(c)")  

    } else {  

      println("Something was nil!")  

    }  

  } else {  

    println("Something was nil!")  

  }  

} else {  

  println("Something was nil!")  

}  

不过似乎有一种替代的方法我们可以尝试:使用闭包形式的回调函数。


在Return语句中使用回调取代可选类型


可选类型会让你的代码变得杂乱,如:


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

let maybeResult: JSONData? = JSONParser.parse(aJSONString)  

if let result = maybeResult {  

    // ...  

}  

调用方需要管理被调用函数功能的结果,它需要知道被调用函数对某些扩展所做的事情。Optionals使用很简单,但你代码中仍会显示解析可选类型留下的复杂的痕迹。


考虑East-Oriented代码的原则:如果一个函数返回一个值,定义信息是向西传播。若它发送的是一个信息时,是向东传播。一个Optional返回值是向西传播信息,而且也正因为它是一个Optional ,较之普通的返回值要更复杂。因为它在一个调用中有两种情况。如果是嵌套调用和嵌套的if语句则会更糟糕。


让我们转移注意力到被调用函数工作的失败部分。


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

JSONParser.parse(aJSONString) { data: JSONData in  

    // ...  

}  

现在parse()需要考虑失败处理,只有一切运行顺畅时,它才会进行调用实现成功关闭。反之,调用方不会采取行动。


这足以去执行异步获取和UI更新。如果需要的话,解析器将记录或报告致命的失败地方。你甚至可以外包加工大量的数据到一个XPC服务,以及从一开始设计异步交互。

如果需要的话,我们甚至可以显式地处理失败部分:


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片

JSONParser.parse(aJSONString, success: {  

    data: JSONData in  

    // ...  

}, failure: {  

    error: NSError in  

    NSLog("An error occured while parsing: \(error.description)")  

})  

以NSAsynchronousFetchRequest为例:它有一个完成的代码块,如果请求失败,将不会被调用。Cocoa API也开始越来越多的使用代码块。所以,你可以尝试使用这种方法,也许能够改善你应用的控制流。


文章来源:christiantietze

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息