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)+":禁止错误传递")

Swift 中异常抛出和四种异常处理的更多相关文章

  1. C# 中异常抛出捕获机制--throw / try,catch,finally

    try { messagebox.show("true"); } catch { messagebox.show("false"); } finally { m ...

  2. python3中try异常调试 raise 异常抛出

    一.什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Python对象,表示一个错误. 当Py ...

  3. python3 中的try 异常调试与 raise 异常抛出

    一.什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Python对象,表示一个错误. 当Py ...

  4. JUnit中测试异常抛出的方法

    最近在做TWU关于TDD的作业,对JUnit中测试异常抛出的方法进行了一些学习和思考. 在进行单元测试的时候有的时候需要测试某一方法是否抛出了正确的异常.例如,我有一个方法,里面对一个List进行读取 ...

  5. 在java中,异常抛出点后程序的执行情况

    1.在throw语句,即自定义的抛出异常语句后面的代码并不会执行,会提示错误,编译器并不可以正常编译. 2.若在一个条件语句中抛出一个异常,程序可以编译,但不会运行(dead code). 3.若在一 ...

  6. java异常处理 throw RuntimeException时不需要同时方法中声明抛出throws 异常等待调用者catch进行捕获 子父类异常问题

    package com.swift.exception1; public class Demo_Exception { public static void main(String[] args) { ...

  7. lambda表达式中无法抛出受检异常!

    抛出受检异常的时候,我们的接口应该带上throw关键字,但通过lambda表达式实现的Consumer的accept方法并不带有关键字,因此在lambda表达式中不能抛出受检异常必须把它吃掉

  8. 编写Java程序,模拟五子棋博弈过程中的异常声明和异常抛出

    返回本章节 返回作业目录 需求说明: 模拟五子棋博弈过程中的异常声明和异常抛出,判断用户所下棋子的位置,是否超越了棋盘的边界. 棋盘的横坐标的范围为0-9,纵坐标范围为0-14,如果用户所放棋子的坐标 ...

  9. stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结

    stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结 1. auto_ptrauto_ptr主要是用来解决资源自动释放的问题,比如如下代码:voi ...

随机推荐

  1. mysql查询最新一组数据

    public function getDetail(){ $sql = "SELECT * FROM (SELECT * FROM Z_CFTC_GOV_NEW ORDER BY UPDAT ...

  2. java 参数

    -Xmx:size java最大堆内存 -Xms:size 初始化内存 -Xmn:size 年轻带堆大小 -XX:NewSize=size 年轻带的大小 -XX:NewRatio=ratio 年轻带和 ...

  3. LightOJ 1291 Real Life Traffic

    Real Life Traffic Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on LightOJ. O ...

  4. ios UITextView 提示文本

    定义两个UITextView,一个用于输入文本,一个用于显示提示信息,当输入文本为空时显示提示信息,否则不显示提示信息. //6.3.1文字内容提示 _contentTextViewTip = [[U ...

  5. google 分屏 横屏模式 按home键界面错乱故障分析(二) 分屏的启动过程

    google 进入分屏后在横屏模式按home键界面错乱(二) 你确定你了解分屏的整个流程? imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&quo ...

  6. actionBar-shareIcon 分享按钮的修改

    今天为了修改图库的分享按钮,进行了很多的尝试 1.寻找到了xml文件,如下 <?xml version="1.0" encoding="utf-8"?&g ...

  7. 【单词】常见单词含义的辨异(emulator/simulator、hardware/firmware)

    1. emulator 与 simulator The Simulator tries to duplicate the behavior of the device.(仿真的是行为): The Em ...

  8. 3.1 Broker Configs 官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ 3.1 Broker Configs 3.1 broker配置 The essent ...

  9. POJ3622 Gourmet Grazers(FHQ Treap)

    Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2363   Accepted: 881 Description Like s ...

  10. httpurlconnection发送文件到服务端并接收

    httpurlconnection发送文件到服务端并接收 客户端 import java.io.DataInputStream; import java.io.File; import java.io ...