当前位置: 首页 > news >正文

Swift 中异常抛出和四种异常处理

在Swift中你可以像其他语言一样抛出异常处理异常,今天我们就详细地说说Swift中的异常抛出和处理。
在一开始我们要定义错误或者说是异常,Swift中的一些简单异常可以使用枚举定义,注意这个枚举要继承一个空协议Error,如下代码:

enum OperationError : Error {
    case ErrorOne
    case ErrorTwo
    case ErrorThree(String) case ErrorOther }

这里定义了一个异常值的枚举,接下来我们再写个函数来使用这些异常值,能够抛出异常的函数一定要在函数的表达式后面添加关键字 throws (这种函数一般称作throwing函数),如果这个函数有返回值 throws 关键字要写在 ->ReturnType前面,看代码:

func numberTest(num:Int) throws{
    if num == 1 {
        print("成功")
    }else if num == 2 { throw OperationError.ErrorTwo }else if num == 3{ throw OperationError.ErrorThree("失败") }else { throw OperationError.ErrorOther } }

这是个很简单的函数,可以根据传入参数的值来确定是否抛出异常,抛出何种异常值。
下面看第一种异常处理错误传递法,顾名思义就是函数自己不处理异常将异常抛出给上一级,让上一级处理,如下代码所示:

//错误传递
func throwDeliver(num:Int) throws ->String {
    print("错误传递")
    try numberTest(num: num)
    print("未传递错误") return "无错误" }

throwDeliver这个throwing函数它本身并没有处理numberTest函数可能抛出的异常,而是把异常抛给了调用throwDeliver这个函数的地方处理了。能够传递异常的它本身一定是throwing

第二种使用do-catch捕获处理异常,在do闭包里面执行会抛出异常的代码,在catch 分支里面匹配异常处理异常,看代码:

//do-catch错误捕获
do {
    print("do-catch 错误捕获") try throwDeliver(num: 5) print("未捕获错误") } catch OperationError.ErrorOne { print("ErrorOne:") } catch OperationError.ErrorTwo { print("ErrorTwo:") } catch OperationError.ErrorThree(let discription) { print("ErrorThree:"+discription) }catch let discription{ print(discription) }

第三种,将异常转换成可选值,如果一个语句会抛出异常那么它将返回nil无论这个语句本来的返回值是什么:

//错误转成可选值
if let retureMessage = try? throwDeliver(num: 1) { print("可选值非空:"+retureMessage) }

第四种,禁止异常传递,只有当你确定这个语句不会抛出异常你才可以这么做否则会引发运行时错误:

//禁止错误传递
print(try! throwDeliver(num: 1)+":禁止错误传递")

相关文章:

  • JDK Tools and Utilities---Java Troubleshooting, Profiling, Monitoring and Management Tools
  • Sagit.Framework For IOS 开发框架入门开发教程2:一行代码实现引导页
  • 简单实现UIlabel可复制功能
  • 大数据学习系列之五 ----- Hive整合HBase图文详解
  • REST开放接口生成文档工具之apidoc
  • 自建Maven仓库 - Artifactory
  • 微信管理
  • 推荐一个提升工作效率的小插件[intellij-postfix-templates]
  • 面试(1)
  • ios - 关于拖动手势简单应用场景
  • 第二课、GUI程序实例分析------------------狄泰软件学院
  • 第五课、Qt Creator 工程介绍------------------狄泰软件学院
  • PL/pgSQL RETURNS TABLE 例子
  • 贝塞尔曲线学习
  • 2007浙大复试上机考试题目2--统计字符
  • [笔记] php常见简单功能及函数
  • Electron入门介绍
  • gcc介绍及安装
  • Laravel核心解读--Facades
  • oschina
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Vim 折腾记
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue数据传递--我有特殊的实现技巧
  • Vue小说阅读器(仿追书神器)
  • 编写符合Python风格的对象
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 基于Android乐音识别(2)
  • 理清楚Vue的结构
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 软件开发学习的5大技巧,你知道吗?
  • 通过npm或yarn自动生成vue组件
  • 小程序 setData 学问多
  • ​决定德拉瓦州地区版图的关键历史事件
  • #QT(TCP网络编程-服务端)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (分享)自己整理的一些简单awk实用语句
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (九)信息融合方式简介
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)EOS中账户、钱包和密钥的关系
  • . Flume面试题
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .gitignore
  • .mysql secret在哪_MySQL如何使用索引
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .Net Remoting常用部署结构
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net反编译的九款神器
  • .net反混淆脱壳工具de4dot的使用
  • .net和jar包windows服务部署
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • @test注解_Spring 自定义注解你了解过吗?