Swift2.0-异常处理(Exception handler)

前言

关于我们为什么要使用异常处理,请看百度百科为我们作出的描述,想要更详细的资料请点这里

异常处理,英文名为exceptional handling, 是代替日渐衰落的error code方法的新法,提供error code 所未能具体的优势。异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。 异常处理(又称为错误处理)功能提供了处理程序运行时出现的任何意外或异常情况的方法。异常处理使用 try、catch 和 finally 关键字来尝试可能未成功的操作,处理失败,以及在事后清理资源。
异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。 它有功能强大的控制流语句,像`do`、`try`、`catch`、`guard`和`defer`。我们能够使用这些关键字去操控我们的代码,更精确地执行我们的代码。

以上摘自百度百科:

关联,在Objective-C中,异常处理一般都是使用NSError类接收异常和抛出异常,使用方法像这样

NSError *error = nil;
NSString *string = [[NSString alloc] initWithContentsOfFile:@"filePath" encoding:NSUTF8StringEncoding error:&error];
if (error != nil) {
// Exception handle
NSLog(@"Erorr is %@", error);
}
// Code...

不得不说,Swift的异常处理更为优雅,下面会重点介绍。

Demo

你可以在github上下载这个示例Demo

构建异常类型

我们可以构建自己的异常类型,它只是一个枚举,遵循ErrorType,像是这样

enum MyErrorHandling: ErrorType {

    case error1
case error2 }

定义函数可抛出异常

这里值得一提的是,只有函数才能够抛出异常。我们需要在参数后和返回值前加上throws关键字,并用guard捕捉异常,用throw抛出异常。

func myLoad(item: String?) throws -> String {
guard let newItem = item else {
throw MyErrorHandling.error1
}
return newItem
}

guard: guard必须与else配合使用,只有当guard审查的条件成立,guard之后的代码才会执行,否则抛出异常。

捕获/处理异常

我们使用do-try-catch去获取并处理异常

do {
try myLoad(nil)
} catch {
print("error")
}

如果只包含一个catch语句,那么所有的错误都会在这个catch中执行,我们能够捕抓其错误信息

do {
try myLoad(nil)
} catch let error as NSError {
print(error)
}

我们在使用catch时,它是能够进行模式匹配的,我们能够进行更精准的错误匹配处理

do {
try myLoad("test")
} catch MyErrorHandling.error1 {
print("error1")
} catch MyErrorHandling.error2 {
print("error2")
}

如果我们不需要捕抓错误,那么我们可以使用try!try?去执行该函数

try? myLoad(nil)

不建议使用try!,使用try?会更加安全。因为如果当有错误捕抓到时,程序会直接崩溃

Defer(延迟执行)

那么我们何时需要使用到defer?这里使用官方的例子,比如我们需要读取某文件内容并处理,你需要打开这个文件,最后你需要关闭这个文件。当一切顺利的时候,程序一直往下运行,文件也将会被关闭。那么当中间出现一些错误呢?例如在某个环节执行失败了,但是你依然是需要去关闭该文件,在此defer就表现得很强大了。在这个例子中,我们可以把关闭文件的代码放到defer里面,在defer里的代码无论是函数执行成功或失败都会被执行。

func myLoad(item: String?) throws -> String {
defer {
print("Handle 1")
} defer {
print("Handle 2")
} guard let newItem = item else {
throw MyErrorHandling.error1
} return newItem
}

需要注意的是,defer语句可以有多个,它们的执行顺序是Handle 1 -> Handle 2。不难理解,它们的执行顺序是先进后出的。

这里再说一下,你可以在github上下载这个示例Demo

声明

博文作者:GarveyCalvin

博文出处:http://www.cnblogs.com/GarveyCalvin/

本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

Swift2.0-异常处理(Exception handler)的更多相关文章

  1. Spring Cloud Gateway自定义异常处理Exception Handler

    版本: Spring Cloud 2020.0.3 常见的方法有 实现自己的 DefaultErrorWebExceptionHandler 或 仅实现ErrorAttributes. 方法1: Er ...

  2. Swift2.0异常处理

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

  3. 总结swift 1.2适配swift2.0遇到的改变

    swift1.2适配swift2.0 以下列举的是我在项目中遇到的需要修改的,基本常见的问题就没有罗列了. 1.find函数变成了为indexOf 2.sort变成了sortInPlace 3.sor ...

  4. 异常处理—Exception(二)

    在上一篇中"异常处理--Exception(一)"中,跟大家简单介绍了一下Exception,也使大家充分的了解了Exception管理在一个项目中的重要性,那如何在我们的项目中处 ...

  5. java异常处理Exception

    我看别人的面经中有一道题目就问到了Exception,即java的异常处理的,我曾经也学了java的异常处理,可是我查了下,看了别人的博客关于写的exception异常处理.我发现,自己学的不坚固,仅 ...

  6. (IOS)Swift2.0 Radio 程序分析

    本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源项目Swift Radio的研究心得. 项目地址:https://github.com/swiftcodex/Swift-Rad ...

  7. [Swift2.0系列]Defer/Guard 基础语法

    1.Defer Swift2.0中加入了defer新语法声明.defer译为延缓.推迟之意.那么在Swift2.0中它将被应用于什么位置呢?比如,读取某目录下的文件内容并处理数据,你需要首先定位到文件 ...

  8. Swift2.0 中的String(三):类型转换

    本系列第三篇,String相关的类型转换.其他的几篇传送门(GitHub打不开链接的同学请自行把地址github改成gitcafe,或者直接去归档里找:-P): Swift2.0 中的String(一 ...

  9. Swift2.0 中的String(二):基本操作

    Swift中的字符串,第二篇,基本操作.其他的几篇传送门(GitHub打不开链接的同学请自行把地址github改成gitcafe,或者直接去归档里找:-P): Swift2.0 中的String(一) ...

随机推荐

  1. AtCoder Beginner Contest 022 A.Best Body 水题

    Best Body Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://abc022.contest.atcoder.jp/tasks/abc02 ...

  2. [Asp.net]使用flexpaper+swftools大文件分页转换实现在线预览

    引言 之前总结了在线预览几种常见解决方案,可以戳这里: http://www.cnblogs.com/wolf-sun/p/3569960.html http://www.cnblogs.com/wo ...

  3. tomcat JVM内存 配置

    原文:http://elf8848.iteye.com/blog/467460 常见的内存溢出有以下两种: java.lang.OutOfMemoryError: PermGen space java ...

  4. wget 下载文件重进行命名

    wget在下载的时候就重命名的: wget -c "www.baidu.com" -O baidu.index.html 保存输出日至,可以使用: wget -c "ww ...

  5. 【资料】wod旗帜,纹章

    物品 徽章 旗帜 掉落地点 备注 火焰纹章 法师与怪物 火焰魔法.魔法攻防 雄鹰纹章 受诅咒的遗迹 弩系相关 盗贼纹章 捉迷藏 偷袭.匕首.割喉.近攻防 守夜人的纹章 酒馆里平静的一天 钝器.双打.旋 ...

  6. Run Redis On Windows

    If you go to the current version and open up the bin > release folder, you'll get a ZIP file cont ...

  7. Js的在线代码编辑器:CodeMirror

    github地址:https://github.com/codemirror/CodeMirror/tree/master/demo 里面包含需要的js.css文件以及大量的示例 官网:https:/ ...

  8. 线段树(Segment Tree)(转)

    原文链接:线段树(Segment Tree) 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lg ...

  9. flume学习(三):flume将log4j日志数据写入到hdfs(转)

    原文链接:flume学习(三):flume将log4j日志数据写入到hdfs 在第一篇文章中我们是将log4j的日志输出到了agent的日志文件当中.配置文件如下: tier1.sources=sou ...

  10. C# 弹出USB外接硬盘(U盘)

    最近一个项目需要通过代码来弹出USB外接硬盘设备,经过google找到了下面这个类库: http://www.codeproject.com/Articles/13530/Eject-USB-disk ...