我们在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. Machine Learning | (7) Scikit-learn的分类器算法-决策树(Decision Tree)
  2. 怎么设计计算机网络共享,如何设置网络共享 网络共享设置方法【详解】
  3. 12.history的用法
  4. java线程interrupt用法_Java线程中interrupt那点事 | 学步园
  5. AT91SAM9260EK-38k产生原理
  6. 互联网晚报 | 3月25日 星期五 |​ ​​私募大佬但斌疑似空仓;蔚来和小米汽车拟采用比亚迪电池...
  7. thinkphp的find()方法获取结果
  8. 习题4-6 水仙花数(20 分)
  9. sql server2008如何修改mac地址_QCC304x/QCC514x:修改蓝牙MAC地址及名称
  10. 数据通信与网络有这一篇就够了(概述篇)
  11. 计算机软件专业搞腾讯地图,腾讯地图电脑离线版
  12. android 解码 gif 时间,Android 平台实现Gif 图像解码并播放代码及组件
  13. iatf16949内审员_IATF16949:2016内审员试题及答案.pdf
  14. linux内核编译及config配置
  15. 小爱音箱 电脑 麦克风_颜值音质皆出色,还有丰富功能,小米小爱音箱体验
  16. h5+js+ajax+百度翻译API:实现翻译功能
  17. Java代码小demon(一)SpringBoot+二维码和条形码生成
  18. 【TS】<T> 泛型
  19. MBR格式转GPT格式阿里云云盘在线扩容
  20. 调用bing图片html代码,网站背景调用必应Bing每日图片教程附接口

热门文章

  1. NOVA温控器参数笔记(十三)
  2. Educoder - Java入门 - Java循环与分支语句编程各关卡题目总结
  3. 杜邦分析模型 java_1.杜邦分析法的核心指标是(  )。
  4. 通过开发深入解外挂原理【01】
  5. CodeForces ~ 996B ~ World Cup (思维)
  6. 爪哇java怎么读_Javan[贾万,贾范,爪哇]英文名的中文翻译意思、发音、来源及流行趋势-千代英文名...
  7. 如何对每天的数据进行累计计算和啊?
  8. Win7sp1 64位 部分软件和文档字体显示乱码2种解决方法
  9. ZZULIOJ.1123: 最佳校友
  10. html5实现贪吃蛇小游戏,H5 canvas实现贪吃蛇小游戏