上面这段代码使用了 guard 来进行unwrap optional value。这是 Swift 2.0 提供的一个新的方法。
Guard
在 Haskell,Erlang 等语言中早已存在 guard,在这里有更多关于它的介绍。
guard 翻译过来可以理解为守护,守卫。
在 Swift 中,guard 有点像 if 但是他们有两个非常重要的区别
guard 中的 else 只能执行转换语句,像 return,break,continue 或者 throws 当然你也可以在这里返后一个函数或者方法。
值得注意的是,guard的使用会提高你代码的可读性,但是也代表你的代码的执行会有非常明确的顺序性,这一点需要开发者们留心处理。
虽然我们在异常处理中提到了 guard 但是不代表它只能在异常处理中使用。它具有广泛的适用性,或许过阵子我会专门为 guard的使用写篇文章。
如何获取并处理异常?
上文讲述了如何建造抛出异常,获取和处理异常就变得很简单了。使用 do-catch 机制。
5
do
{
try
functionWillThrowError()
}
catch
{
//dealwitherror
do-catch 机制简单易懂。很多编程语言也使用类似的机制进行异常处理,但是在 Swift 中有一个比较重要的特性。
catch 和 switch 一样具有Pattern Matching的能力。所以,使用 catch 你可以对异常的解析进行更为高级的处理
7
MyError.NotExist{
//dealwithnotexist
MyError.OutOfRange{
//dealwithnotexist
这里值得提一下在 Swift 2.0中一个跟异常处理没有关系的改进
Swift 2.0 中没有了 do-while循环,取而代之的是 repeat-while。苹果说这个改动是为了增强代码的可读性。但是我更觉得是为了让我们更舒服的使用 do-catch
不处理异常
如果我不想处理异常怎么办,或者说,我非常确定某个方法或者函数虽然声明会抛出异常,但是我自己知道我在使用时候是绝对不会抛出任何异常的。这种情况下 我们可以使用 try!
1
!functionThrowErrorNil()
|
当然,如果你使用 try!,而你的方法或者函数抛出了异常,那么你会得到一个运行中异常 (runtime error) 所以我们开发者需要慎用哦。
Defer
文章结束前我们再讨论下 defer
在你的代码块就要结束前。如果你使用了 defer。 在其之中的代码就会运行。等于说,给了你最后的机会来进行一些处理。如果你熟悉 BDD 或者 TDD, 那么你可以参考他们中的 aferAll 机制
9
10
11
12
13
14
15
16
funcmyFunction()throws{
defer{
//NomatterwhathappenedIneeddosomething
print(
"Alldone,cleanuphere"
)
}
{
//needthrowstheerrorout
MyError.NotExist
}
guarditem.count>maxNumber
{
//needthrowstheerrorout
MyError.OutOfRange
}
//dosomethingwithitem
//...
注意,如果你有多个defer 语句,他们在执行的顺序会和栈一样,最后一个进,第一个出。
总结
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|
| |