swift3新路程(11)错误处理(Error Handling)
我们在Java等其他语言之都知道有错误处理 基本上都是 try和catch配对的
那么在swift中同样也有
我们首先可以定义一下自己的错误类型如下面
enum MyErrors:Error {case NOT_NUMBERICcase NO_NAMEcase OUT_OF_RANGE}
对于异常的抛出,同样是使用throw关键字,我们使用throws来标记某个函数有异常抛出
我们来定义一个函数,用来做异常抛出
func testMyErrors(name:String,objects:[NSObject],index:Int ) <span style="color:#ff0000;">throws</span> -> Void {if name.isEmpty {<span style="color:#ff0000;">throw</span> MyErrors.NO_NAME}if objects.count < index {<span style="color:#ff0000;">throw</span> MyErrors.OUT_OF_RANGE}for object in objects {if !(object is Int) {<span style="color:#ff0000;">throw</span> MyErrors.NOT_NUMBERIC}}print("Name is \(name)")
}
然后我们如何捕获异常并做处理呢?
do {let objs:[NSObject] = [3 as NSObject,4 as NSObject]try testMyErrors(name: "", objects:objs, index: 1)
} catch MyErrors.NO_NAME {print("名称为空")
}
我们看到使用的是 do 和 catch 当然还有try 不过try的位置跟我们所熟悉的Java代码的位置有所不同
我们这里讲name设置为空,那么就会抛出一个MyErrors.NO_NAME的异常,我们在catch中可以捕获,并做相应的处理,那么这里将会输出”名字为空“的信息
当然这是我们已经知道的可能发生的异常,我们可以精确地捕捉到,我们都知道Java中的异常处理一般是按照从小到大的范围进行网络的,最后就是最大的异常类型Exception
在swift中同样也可以,上面我们知道了名字可能为空,其他的具体还会发生什么,我们可能不太清楚,我们就可以使用下面的处理
do {let objs:[NSObject] = ["Ryoma" as NSObject,4 as NSObject]try testMyErrors(name: "Ryoma", objects:objs, index: 1)
} catch MyErrors.NO_NAME {print("名称为空")
} catch let myError as MyErrors {print(myError)
} catch {print(error)
}
这里我们看到名字不会出现问题了,但是数组内的第一项不是Int类型的,这时肯定会出异常,我们的MyErrors.NO_NAME这个类型肯定捕获不到的,但是我们在后面定一个myError是MyErrors的类型,也就是如果发生的错误是MyErrors类型的,几遍我们上面的catch没有捕获到,我们的myError也可以捕获到,并做相应的处理。
如果说在上面的业务代码块中出现了我们无法预测的错误,不在我们所能想到的错误类型中,那也不怕,我们最后的catch会帮我们捕获到,并做处理。
最后的catch中如果我们没有对Error的名字做出什么定义的话(myError就是我们自己定义的名字)话,会有一个默认的错误类型名就是error
当然除了上面的这些错误处理同样还有一种处理,我们使用 try?形式
我们还是使用上面的异常
let objs:[NSObject] = ["Ryoma" as NSObject,4 as NSObject]
try testMyErrors(name: "Ryoma", objects:objs, index: 1)
这样写的话因为没有catch,是无法捕获异常的,程序肯定是崩溃的
let objs:[NSObject] = ["Ryoma" as NSObject,4 as NSObject]
try? testMyErrors(name: "Ryoma", objects:objs, index: 1)
如果我们这样写了,使用了try?的话程序就会ok的结束,如果try?后面的执行抛出了异常,那么这个异常会被忽略,如果try?的后面是具有返回值的表达式,那么这个表达式的值就是nil,如果没有异常发生,那么这个表达式的值就会被转成一个可选的值(有可能有也有可能为nil)
关于异常处理还有一个点就是defer,我个人感觉他就像是Java中的finally,就是不管这个处理中有没有异常发生,都要执行的,我们可以这里面做一些自己需要的处理,而且如果我们在一个处理中写有多个defer的话,他是按照先进后出的原则执行的
func say(){do {let objs:[NSObject] = ["Ryoma" as NSObject,4 as NSObject]try testMyErrors(name: "Ryoma", objects:objs, index: 1)} catch MyErrors.NO_NAME {print("名称为空")} catch let myError as MyErrors {print(myError)} catch {print(error)}defer {print("finally will be executed even if there's an error")}defer {print("defer2")}defer {print("defer3")}
}
say()
输出
NOT_NUMBERIC
defer3
defer2
finally will be executed even if there's an error
swift3新路程(11)错误处理(Error Handling)相关推荐
- Flex全局错误处理/Global Error Handling in AIR 2.0 and Flash 10.1
Global Error Handling in AIR 2.0 and Flash 10.1 http://blogs.adobe.com/cantrell/archives/2009/10/glo ...
- 19 Error handling and Go go语言错误处理
Error handling and Go go语言错误处理 12 July 2011 Introduction If you have written any Go code you have pr ...
- 升级 GCC 支持C++11 或 configure: error: *** A compiler with support for C++11 language features is requir
升级 GCC 支持C++11 或 configure: error: *** A compiler with support for C++11 language features is requir ...
- 关于error handling的一些理解
关于error handling的一些理解 前言 一.error handing 的常见处理方式 二 .从不同编程语言看错误 2.1 C语言的处理方式 2.2 CPP/JAVA的处理方式 2.3 GO ...
- Swift2.0系列]Error Handling(项目应用篇)
1.FileManager中的应用 倘若你只是想看FileManager中的 Error Handling是如何实现的,请找到3.删除文件以及4.获取文件信息.我分别为你提供了do-catch以及tr ...
- 错误:Error #2032解决方案
问题: Error #2032错误要访问外部数据,必须信任此文件. 现象: 要访问外部数据,必须信任此文件. 对于 PDF 文件,在 Adobe Reader 中,单击"Edit" ...
- setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto
目录 1. 应用场景 2. Use Case Code Analysis 3. 和setjmp.longjmp有关的glibc and eglibc 2.5, 2.7, 2.13 - Buffer O ...
- Xamarin+vs2010部署错误:error MSB6004: 指定的任务可执行文件位置\sdk\\tools\zipalign.exe”无效...
好不容易配好了Xamarin和vs2010,也搞好了GenyMotion的虚拟机配置,开始调试的时候又报出了这样的错误: error MSB6004: 指定的任务可执行文件位置"C:\Use ...
- 安装vs2008中文时出现错误Write error in the file
安装vs2008中文时出现错误Write error in the file VS2008TeamSuite90DayTrialCHSX1429243.iso. Probably the disk i ...
最新文章
- Machine Learning | (7) Scikit-learn的分类器算法-决策树(Decision Tree)
- 怎么设计计算机网络共享,如何设置网络共享 网络共享设置方法【详解】
- 12.history的用法
- java线程interrupt用法_Java线程中interrupt那点事 | 学步园
- AT91SAM9260EK-38k产生原理
- 互联网晚报 | 3月25日 星期五 |​ ​​私募大佬但斌疑似空仓;蔚来和小米汽车拟采用比亚迪电池...
- thinkphp的find()方法获取结果
- 习题4-6 水仙花数(20 分)
- sql server2008如何修改mac地址_QCC304x/QCC514x:修改蓝牙MAC地址及名称
- 数据通信与网络有这一篇就够了(概述篇)
- 计算机软件专业搞腾讯地图,腾讯地图电脑离线版
- android 解码 gif 时间,Android 平台实现Gif 图像解码并播放代码及组件
- iatf16949内审员_IATF16949:2016内审员试题及答案.pdf
- linux内核编译及config配置
- 小爱音箱 电脑 麦克风_颜值音质皆出色,还有丰富功能,小米小爱音箱体验
- h5+js+ajax+百度翻译API:实现翻译功能
- Java代码小demon(一)SpringBoot+二维码和条形码生成
- 【TS】<T> 泛型
- MBR格式转GPT格式阿里云云盘在线扩容
- 调用bing图片html代码,网站背景调用必应Bing每日图片教程附接口
热门文章
- NOVA温控器参数笔记(十三)
- Educoder - Java入门 - Java循环与分支语句编程各关卡题目总结
- 杜邦分析模型 java_1.杜邦分析法的核心指标是( )。
- 通过开发深入解外挂原理【01】
- CodeForces ~ 996B ~ World Cup (思维)
- 爪哇java怎么读_Javan[贾万,贾范,爪哇]英文名的中文翻译意思、发音、来源及流行趋势-千代英文名...
- 如何对每天的数据进行累计计算和啊?
- Win7sp1 64位 部分软件和文档字体显示乱码2种解决方法
- ZZULIOJ.1123: 最佳校友
- html5实现贪吃蛇小游戏,H5 canvas实现贪吃蛇小游戏