转自:http://www.jianshu.com/p/96a7db3fde00html
WWDC 2015 宣布了新的 Swift 2.0. 此次重大更新给 Swift 提供了新的异常处理方法。这篇文章会主要围绕这个方面进行讨论。ios
在 iOS 开发当中,咱们会面对不少异常处理。在 Cocoa Touch 中咱们使用 NSError
来进行异常处理。在新的 Swift 2.0 中,咱们可使用新的 ErrorType
protocol。编程
在 Swift 中, enum
是最好的方法创建属于你本身的异常类型,你只要在你的 enum
中确认新的 ErrorType
。swift
enum MyError: ErrorType { case NotExist case OutOfRange }
在抛出异常以前,咱们须要在函数或方法的返回箭头 ->
前使用 throws
来标明将会抛出异常bash
func myMethodRetrunString() throws -> String // No return, we can just add throws in the end func myMethodRetrunNothing() throws
声明以后, 咱们须要在函数或者方法里扔出异常,很简单使用throw
就能够了app
func myMethod() throws //... // item is an optional value guard let item = item else { // need throws the error out throw MyError.NotExist } // do with item }
上面这段代码使用了 来进行unwrap optional value。这是 Swift 2.0 提供的一个新的方法。guard
在 Haskell, Erlang 等语言中早已存在 guard
, 在这里有更多关于它的介绍。编程语言
guard
翻译过来能够理解为守护,守卫。函数
在 Swift 中,guard
有点像 if
可是他们有两个很是重要的区别spa
guard
必须强制有 else
语句guard
审查的条件成立,guard
以后的代码才会运行 (像守卫同样,条件不符就不让过去)。guard
中的 else
只能执行转换语句,像 return
, break
, continue
或者 throws
固然你也能够在这里返后一个函数或者方法。翻译
值得注意的是,guard
的使用会提升你代码的可读性,可是也表明你的代码的执行会有很是明确的顺序性,这一点须要开发者们留心处理。
虽然咱们在异常处理中提到了 guard
可是不表明它只能在异常处理中使用。它具备普遍的适用性,或许过阵子我会专门为 guard
的使用写篇文章。
上文讲述了如何建造抛出异常,获取和处理异常就变得很简单了。使用 do-catch
机制。
do { try functionWillThrowError() } catch { // deal with error }
机制简单易懂。不少编程语言也使用相似的机制进行异常处理,可是在 Swift 中有一个比较重要的特性。do-catch
catch
和 switch
同样具备 Pattern Matching 的能力。因此,使用 catch
你能够对异常的解析进行更为高级的处理
do { try functionWillThrowError() } catch MyError.NotExist { // deal with not exist } catch MyError.OutOfRange { // deal with not exist }
这里值得提一下在 Swift 2.0中一个跟异常处理没有关系的改进
Swift 2.0 中没有了
do-while
循环,取而代之的是repeat-while
。苹果说这个改动是为了加强代码的可读性。可是我更以为是为了让咱们更舒服的使用do-catch
若是我不想处理异常怎么办,或者说,我很是肯定某个方法或者函数虽然声明会抛出异常,可是我本身知道我在使用时候是绝对不会抛出任何异常的。这种状况下 咱们可使用 try!
try! functionThrowErrorNil()
固然,若是你使用 try!
,而你的方法或者函数抛出了异常,那么你会获得一个运行中异常 (runtime error) 因此咱们开发者须要慎用哦。
文章结束前咱们再讨论下 defer
在你的代码块就要结束前。若是你使用了 defer
。 在其之中的代码就会运行。等于说,给了你最后的机会来进行一些处理。若是你熟悉 BDD 或者 TDD, 那么你能够参考他们中的 aferAll
机制
文/阮超(简书做者) 原文连接:http://www.jianshu.com/p/96a7db3fde00 著做权归做者全部,转载请联系做者得到受权,并标注“简书做者”。 func myFunction() throws { defer { // No matter what happened I need do something print("All done, clean up here") } guard let item = item else { // need throws the error out throw MyError.NotExist } guard item.count > maxNumber else { // need throws the error out throw MyError.OutOfRange } // do something with item // ... }
注意,若是你有多个
defer
语句,他们在执行的顺序会和栈同样,最后一个进,第一个出。
ErrorType
的帮助创建你的异常类型throws
来声明异常,用 throw
来抛出异常do-catch
机制来获取和处理异常