我们在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)相关推荐

  1. 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 ...

  2. 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 ...

  3. 升级 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 ...

  4. 关于error handling的一些理解

    关于error handling的一些理解 前言 一.error handing 的常见处理方式 二 .从不同编程语言看错误 2.1 C语言的处理方式 2.2 CPP/JAVA的处理方式 2.3 GO ...

  5. Swift2.0系列]Error Handling(项目应用篇)

    1.FileManager中的应用 倘若你只是想看FileManager中的 Error Handling是如何实现的,请找到3.删除文件以及4.获取文件信息.我分别为你提供了do-catch以及tr ...

  6. 错误:Error #2032解决方案

    问题: Error #2032错误要访问外部数据,必须信任此文件. 现象: 要访问外部数据,必须信任此文件. 对于 PDF 文件,在 Adobe Reader 中,单击"Edit" ...

  7. 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 ...

  8. Xamarin+vs2010部署错误:error MSB6004: 指定的任务可执行文件位置\sdk\\tools\zipalign.exe”无效...

    好不容易配好了Xamarin和vs2010,也搞好了GenyMotion的虚拟机配置,开始调试的时候又报出了这样的错误: error MSB6004: 指定的任务可执行文件位置"C:\Use ...

  9. 安装vs2008中文时出现错误Write error in the file

    安装vs2008中文时出现错误Write error in the file VS2008TeamSuite90DayTrialCHSX1429243.iso. Probably the disk i ...

最新文章

  1. 教你如何在面试中用「10分钟快速分析」一款产品
  2. SAP CRM product customizing下载的第三个队列
  3. java 动态字符串_Java动态编译执行一串字符串,类似于Javascript里的eval函数
  4. IOC操作Bean管理XML方式(bean 的生命周期)
  5. 外媒:伊朗政府封锁加密通讯应用Signal
  6. xcode6新建pch文件过程
  7. [SDOI2011]打地鼠
  8. java8函数式编程闭包_java8入门必备—函数式编程思维——函数式语言向语言和运行时让渡控制权的途径——迭代让位于高阶函数、闭包...
  9. TypeError: Cannot read property ‘forceUpdate‘ of undefined
  10. js高级学习笔记(b站尚硅谷)-15-闭包的剩余知识
  11. “当前页面的脚本发生错误”如何解决
  12. 服务器架设项目实训,计算机组网项目实训
  13. 充满正能量阳光活的生日祝福语
  14. xstring invalid null pointer
  15. 《C语言》4小时不挂科【猴博士爱讲课】(学习笔记)
  16. 爬取京东网站前后一星期的笔记本电脑信息并可视化
  17. python_dict_好玩游戏的物品清单
  18. 白帽子黑客与网络安全工程师带你:远程桌面漏洞利用与Windows7计算机攻防实战
  19. linux 内核空间占用cpu百分比过高,线上linux系统故障排查之一:CPU使用率过高
  20. MATLAB函数图形绘制

热门文章

  1. Basler_pylon_5.0.12安装教程
  2. bilibili怎么用用户名登录_bilibili如何激活账号 哔哩哔哩激活账号的教程
  3. Activiti常见操作数据表关系
  4. 中国目前最具竞争力的二线城市有哪些?
  5. 重复关键字造成关键字竞价价格抬高—Google Adwords
  6. Jieba库使用和好玩的词云
  7. nes 红白机模拟器 第6篇 声音支持
  8. 尚硅谷Vue2学习笔记分享
  9. java实现kfc点餐系统
  10. 日常一记(6)--excel输出不重复项