文档章节

Swift 2.0 异常处理

法斗斗
 法斗斗
发布于 2016/03/01 18:45
字数 1149
阅读 7
收藏 0

Swift 2.0 异常处理

WWDC 2015 宣布了新的  Swift 2.0 . 这次重大更新给 Swift 提供了新的异常处理方法。这篇文章会主要围绕这个方面进行讨论。

如何建造异常类型?

在 iOS 开发当中,我们会面对很多异常处理。在 Cocoa Touch 中我们使用 NSError 来进行异常处理。在新的 Swift 2.0 中,我们可以使用新的 ErrorType protocol。

在 Swift 中, enum 是最好的方法建立属于你自己的异常类型,你只要在你的 enum 中确认新的 ErrorType。

1
2
3
4
enum MyError: ErrorType {  
  case NotExist
  case OutOfRange
}

如何抛出异常

在抛出异常之前,我们需要在函数或方法的返回箭头 -> 前使用 throws 来标明将会抛出异常

1
2
3
func myMethodRetrunString() throws -> String
// No return, we can just add throws in the end
func myMethodRetrunNothing() throws

声明之后, 我们需要在函数或者方法里扔出异常,很简单使用throw 就可以了

1
2
3
4
5
6
7
8
9
func myMethod() throws
  //...
  // item is an optional value
  guard let item = item else {
    // need throws the error out
    throw MyError.NotExist
  }
  // do with item
}

上面这段代码使用了 guard 来进行unwrap optional value。这是 Swift 2.0 提供的一个新的方法。

Guard

在 Haskell, Erlang 等语言中早已存在 guard, 在这里有更多关于它的介绍

guard 翻译过来可以理解为守护,守卫。

在 Swift 中,guard 有点像 if 但是他们有两个非常重要的区别

  • guard 必须强制有 else 语句

  • 只有在 guard 审查的条件成立,guard 之后的代码才会运行 (像守卫一样,条件不符就不让过去)。

guard 中的 else 只能执行转换语句,像 return, break, continue 或者 throws 当然你也可以在这里返后一个函数或者方法。

值得注意的是,guard的使用会提高你代码的可读性,但是也代表你的代码的执行会有非常明确的顺序性,这一点需要开发者们留心处理。

虽然我们在异常处理中提到了 guard 但是不代表它只能在异常处理中使用。它具有广泛的适用性,或许过阵子我会专门为 guard的使用写篇文章。

如何获取并处理异常?

上文讲述了如何建造抛出异常,获取和处理异常就变得很简单了。使用 do-catch 机制。

1
2
3
4
5
 do {
    try functionWillThrowError()
  } catch {
    // deal with error
  }

do-catch 机制简单易懂。很多编程语言也使用类似的机制进行异常处理,但是在 Swift 中有一个比较重要的特性。

catch 和 switch 一样具有 Pattern Matching 的能力。所以,使用 catch 你可以对异常的解析进行更为高级的处理

1
2
3
4
5
6
7
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!

1
  try! functionThrowErrorNil()

当然,如果你使用 try!,而你的方法或者函数抛出了异常,那么你会得到一个运行中异常 (runtime error) 所以我们开发者需要慎用哦。

Defer

文章结束前我们再讨论下 defer

在你的代码块就要结束前。如果你使用了 defer。 在其之中的代码就会运行。等于说,给了你最后的机会来进行一些处理。如果你熟悉 BDD 或者 TDD, 那么你可以参考他们中的 aferAll 机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 机制来获取和处理异常

© 著作权归作者所有

共有 人打赏支持
法斗斗
粉丝 20
博文 367
码字总数 17774
作品 0
杨浦
程序员
Swift 2.0 到底「新」在哪?

【编者按】2015年6月,一年一度的苹果 WWDC 大会如期而至,在大会上苹果发布了 Swift 2.0,引入了很多新的特性,以帮助开发者更快、更简单地构建应用。本篇文章作者是 Maxime defauw ,本文中...

OneAPM蓝海讯通
2015/08/26
14
0
Swift 2.0 发布:即将开源,支持 Linux

在6月9日凌晨举行的WWDC 2015全球开发者大会上,苹果发布了Swift 2.0,并宣布将于今年年底开源Swift语言。Swift2.0引入了很多的新特性以确保开发者可以更快、更简单的构建应用,这些新特性包...

oschina
2015/06/09
22.3K
100
《从零开始学Swift》学习笔记(Day 3)——Swift 2.0之后增加的关键字

Swift 2.0学习笔记(Day 3)——Swift 2.0之后增加的关键字 原创文章,欢迎转载。转载请注明:关东升的博客 看了之前的学习笔记知道了什么是关键字,现在提示各位在Swift 2.0之后增加defer、...

智捷课堂
2015/08/20
0
0
Swift互用性:采用Cocoa设计模式(Swift 2.0版)

Swift互用性:采用Cocoa设计模式(Swift 2.0版) Using Swift with Cocoa and Objective-C:采用Cocoa设计模式(Swift 2.0版更新) 本页包含内容: 委托(Delegation) 错误处理(Error Han...

法斗斗
2016/03/01
13
0
iOS - Swift Swift 语言新特性

1、Swift 2.0 带来哪些新变化 常规变化: 1、OS X 10.11、iOS 9 和 watchOS 2 SDK 采纳了一些 Objective-C 的特性用来提高 Swift 的编程体验, 如可空性、类型化集合和一些别的特性。 2、编译...

仟0123
2016/08/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash各类扩展详解

Bash各类扩展详解 Bash中主要包括大括号扩展、波浪号扩展、变量扩展、子命令扩展、文件名扩展和算数扩展。这些扩展组合在一起为Bash带来了极大的易用性。掌握这些扩展的用法和功能,能够为B...

小陶小陶
39分钟前
1
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
5
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
1
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
1
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部