原标题:Swift2.0-异常处理(Exceptionhandler)
前言
关于我们为什么要使用异常处理,请看百度百科为我们作出的描述,想要更详细的资料请点这里
异常处理,英文名为exceptional handling, 是代替日渐衰落的error code方法的新法,提供error code 所未能具体的优势。异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。 异常处理(又称为错误处理)功能提供了处理程序运行时出现的任何意外或异常情况的方法。异常处理使用 try、catch 和 finally 关键字来尝试可能未成功的操作,处理失败,以及在事后清理照片。
异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。
它有功能强大的控制流语句,像`do`、`try`、`catch`、`guard`和`defer`。我们能够使用这些关键字去操控我们的代码,更精确地执行我们的代码。
以上摘自百度百科:
关联,在Objective-C中,异常处理一般都是使用NSError类接收异常和抛出异常,使用方法像这样
NSError*error=nil; NSString*string=[[NSStringalloc]initWithContentsOfFile:@"filePath"encoding:NSUTF8StringEncodingerror:&error]; if(error!=nil){ //Exceptionhandle NSLog(@"Erorris%@",error); } //Code...
不得不说,Swift的异常处理更为优雅,下面会重点介绍。
Demo
你可以在github上预告这个示例Demo
构建异常类型
我们可以构建自己的异常类型,它只是一个枚举,遵循ErrorType,像是这样
enumMyErrorHandling:ErrorType{ caseerror1 caseerror2 }
定义函数可抛出异常
这里值得一提的是,只有函数才能够抛出异常。我们需要在参数后和返回值前加上throws关键字,并用guard捕捉异常,用throw抛出异常。
funcmyLoad(item:String?)throws->String{ guardletnewItem=itemelse{ throwMyErrorHandling.error1 } returnnewItem }
guard: guard必须与else配合使用,只有当guard审查的条件成立,guard之后的代码才会执行,否则抛出异常。
捕获/处理异常
我们使用do-try-catch去获取并处理异常
do{ trymyLoad(nil) }catch{ print("error") }
如果只包含一个catch语句,那么所有的错误都会在这个catch中执行,我们能够捕抓其错误信息
do{ trymyLoad(nil) }catchleterrorasNSError{ print(error) }
我们在使用catch时,它是能够进行模式匹配的,我们能够进行更精准的错误匹配处理
do{ trymyLoad("test") }catchMyErrorHandling.error1{ print("error1") }catchMyErrorHandling.error2{ print("error2") }
如果我们不需要捕抓错误,那么我们可以使用try!或try?去执行该函数
try?myLoad(nil)
不建议使用try!,使用try?会更加安全。因为如果当有错误捕抓到时,程序会直接崩溃
Defer(延迟执行)
那么我们何时需要使用到defer?这里使用官方的例子,比如我们需要读取某文件内容并处理,你需要打开这个文件,最后你需要关闭这个文件。当一切顺利的时候,程序一直往下运行,文件也将会被关闭。那么当中间出现一些错误呢?例如在某个环节执行失败了,但是你依然是需要去关闭该文件,在此defer就表现得很强大了。在这个例子中,我们可以把关闭文件的代码放到defer里面,在defer里的代码无论是函数执行成功或失败都会被执行。
funcmyLoad(item:String?)throws->String{ defer{ print("Handle1") } defer{ print("Handle2") } guardletnewItem=itemelse{ throwMyErrorHandling.error1 } returnnewItem }
需要注意的是,defer语句可以有多个,它们的执行顺序是Handle 1 -> Handle 2。不难理解,它们的执行顺序是先进后出的。
这里再说一下,你可以在github上预告这个示例Demo
声明
博文作者:GarveyCalvin
博文出处:http://www.cnblogs.com/GarveyCalvin/
本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!
相关:
回顾上一篇文章 《Android应用架构概述》 ,我们知道,Android App 本质上抽象成两个层次:视图和数据。为了
序言在上一篇配置iis负载均衡中我们使用啦微软的ARR,我在那篇文章也中提到了网站的高可用性,但是ARR只能做
本文由玩赚乐(www.banghui.org)– 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!
在当今这个App泛滥的时代,网络请求几乎是每一个App必不可少的一部分,请求几乎遍布App的每一个界面中。我们
文/The 308(微信公众号:科技新知)这两年,“情怀”这两个字的内涵在国人心中可能已经发生了变异;这多半
我想大多数人听说过Node.js,但是你听说过 NodeOS 吗?没错,NodeOS,一个用 Node.js 写的操作系统。好吧,
如何在Windows上脱离Cygwin运行ApacheKafka
本文由玩赚乐(www.banghui.org)– Sandbox Wang原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投
JavaScript 是个灵活的脚本语言,能方便的处理业务逻辑。当需要传输通信时,我们大多选择 JSON 或 XML 格式
今天指数继续窄幅震荡,整天的波动幅度极小,成交金额今天沪指再创阶段新低,成交1640亿,较周五再度缩小,
美声歌手蔡淳佳首度演出电影。(华映提供) 蔡淳佳在《想入飞飞》中又唱又演。(华映提供) 《想入飞飞》