swift 中错误处理

2023-05-16

swift 中错误处理

  • 1. 开发环境说明
  • 2. 自定义错误类型
  • 3. try?的使用方式
  • 4. do...catch的使用
  • 5. try!的使用方式
  • 6. defer的使用
  • 7. 养眼图片一张

1. 开发环境说明

系统版本:macOS Catalina 10.15.4
Xcode版本: Version 11.5 (11E608c)
swift版本: Apple Swift version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53).

2. 自定义错误类型

enum CustomError: Error{
    case Error1
    case Error2
    case Error3(param:String)
}

3. try?的使用方式

定义一个测试用的类

class TestErrorClass {
    var name:String
    init(s:String) throws {
        guard !s.isEmpty else {
            throw CustomError.Error1
        }
        name = s;
    }
    func showString(){
        print("name:\(self.name)")
    }
}

第一种使用方式,运行代码后,直接抛出异常,中止运行:

let tes = try TestErrorClass(s:"")

运行结果:

__lldb_expr_123.CustomError.Error1

第二种使用方式,将try换成try? 运行代码后,tes返回nil,后续代码继续运行:

let tes = try? TestErrorClass(s:"")
if tes == nil {
    print("ERROR:tes is nil.")
} else {
    tes?.showString()
}

运行结果:

ERROR:tes is nil.

4. do…catch的使用

修改一下TestErrorClass,让其抛出的异常使用带参数的Error3

class TestErrorClass {
    var name:String
    init(s:String) throws {
        guard !s.isEmpty else {
            throw CustomError.Error3(param: "名字不能为空")
        }
        name = s;
    }
    
    func showString(){
        print("name:\(self.name)")
    }
}

do{
    let tes = try TestErrorClass(s:"")
    tes.showString()
} catch CustomError.Error1{
    print("CustomError.Error1")
} catch CustomError.Error2{
    print("CustomError.Error2")
} catch CustomError.Error3(let str){
    print("CustomError.Error3: \(str)")
}

当执行到 let tes = try TestErrorClass(s:"") 这行语句时,产生了异常,直接跳转到catch 去匹配一致的错误类型后,执行对应的代码断.运行结果如下:

CustomError.Error3: 名字不能为空

如果不需要做类型区分处理,可以用以下方式:

do{
    let tes = try TestErrorClass(s:"")
    tes.showString()

} catch is CustomError {
 print("CustomError...")
}

这种情况下只要属于CustomError都会执行到该分支代码,运行结果如下:

CustomError...

如果将try?加到do…catch 会如何呢,其实就相当于永完不会catch到异常一样,因为直接返回nil值了,系统也会给给出警告提示.
在这里插入图片描述

5. try!的使用方式

当有些异常在测试代码时是已经知道的,并且不想带有提示和警告,可以使用try! 慎用。。。
比如上面的例子,调用TestErrorClass的地方是一个函数,这样的放在,这个函数也要定义为可能抛出异常
在这里插入图片描述
如果你非常确定这个 TestFunc在正式环境使用中,是不可能产生异常的,那可以改为下面这样:

func TestFunc(){
    let tes = try! TestErrorClass(s:"")
    tes.showString()
}
TestFunc()

6. defer的使用

使用 defer语句,可以保证在代码执行完离开当前代码块前最后执行的语句合集,包括有异常产生的情况.

enum FileError:Error {
    case File_Read_Error
}

class TestErrorClass {
    
    func readLine()throws ->String{
        throw FileError.File_Read_Error
    }
    
    func readFile(filename:String) throws -> String{
        let manager = FileManager.default
        let document = manager.urls(for: .documentDirectory, in: .userDomainMask)
        let pathstr = document[0].appendingPathComponent(filename)
        print(pathstr)
        
        print("打开文件........")
        defer {
             print("defer: 关闭文件.")
         }
        print("读取文件........")
        do {
            try readLine()
        } catch is FileError{
            print("读取文件发生了异常.")
        }
        return "读取的全部内容"
    }
}

let t = TestErrorClass()
let c = try? t.readFile(filename: "abc.txt")

执行结果如下:

file:///Users/xuanwenchao/Library/Developer/XCPGDevices/01FCF58C-8F84-47B7-9487-F825A5A0D4D3/data/Containers/Data/Application/C5A3BCA5-D5BB-49B3-9DEE-098EB836C3A4/Documents/abc.txt
打开文件........
读取文件........
读取文件发生了异常.
defer: 关闭文件.

7. 养眼图片一张

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

swift 中错误处理 的相关文章

随机推荐

  • Linux:Shell脚本基本命令

    24 span class token keyword if span span class token punctuation span span class token punctuation span span class token
  • Spring Boot设置值:分别用@ConfigurationProperties和@Value给属性设值及其区别

    目录 64 ConfigurationProperties给属性映射值 编写JavaBean 编写配置文件 测试类 xff1a 运行结果 xff1a 64 Value给属性设置值 编写JavaBean 运行结果 xff1a 64 Confi
  • Mac Intrellij IDEA中使用debug调试

    目录 一 Debug开篇 二 基本用法 amp 快捷键 三 变量查看 四 计算表达式 五 智能步入 六 断点条件设置 七 多线程调试 八 回退断点 九 中断Debug 十 附 xff1a JRebel激活 Debug用来追踪代码的运行流程
  • Docker创建容器步骤解析

    创建hello world容器 以创建一个简单的hello world容器为例 xff0c 介绍docker创建容器的几大步骤 运行命令 xff1a docker run hello world docker运行步骤分析
  • 什么是代理服务器及其作用

    什么是代理服务器 代理服务器 xff08 Proxy Server xff09 是网上提供转接功能的服务器 xff0c 在一般情况下 xff0c 我们使用网络浏览器直接去连接其他Internet站点取得网络信息时 xff0c 是直接联系到目
  • sudo apt-get update执行失败问题解决

    错误 在执行sudo apt get update命令时 xff0c 执行结果失败 xff0c 错误信息如下 xff1a 获取 xff1a 1 http repo mysql com trusty InRelease 33 5 kB 100
  • @EntityListeners(AuditingEntityListener.class)介绍

    64 EntityListeners 源码 Specifies the callback listener classes to be used for an entity or mapped superclass This annotat
  • windows配置hadoop(详细)

    一 环境 windows7 64位 hadoop2 7 二 安装java1 8 xff0c 并配置环境变量 下载地址 xff1a http www oracle com technetwork java javase downloads j
  • Windows更新策略配置

    两个步骤 1 开启自动更新服务 2 配置自动更新策略 开启服务 Windows Update的服务名为wuauserv 可以通过命令行的方式进行开启 xff08 管理员权限 xff09 xff0c sc命令使用方法 xff1a sc命令使用
  • 数据库、MySQL与Python这一篇就够了

    lt 1 gt 数据库介绍 什么是数据库 xff1f 数据库 xff08 Database xff09 是按照数据结构来组织 存储和管理数据的仓库 xff0c 每个数据库都有一个或多个不同的API用于创建 xff0c 访问 xff0c 管理
  • Python:同行if...else...详细教程

    我最近为游戏Apple Clicker写成就系统 xff0c 加上后整个程序的代码竟然超过2200行 xff0c 窗口启动时间也很慢 xff0c 主要是if else 使用的太多 于是查了查缩短代码的方法 xff0c 总结如下 xff1a
  • ARM:驱动开发1

    linux内核模块 1 模块三要素 xff1a 内核模块不能单独执行 xff0c 也不能自动执行 span class token comment 入口 xff1a span span class token keyword static
  • Python:环境变量配置方法 详细教程

    最近有人问我如何配置python环境变量 xff0c 这篇文章就向大家介绍python环境变量配置方法 python环境变量的配置方法 xff1a 首先鼠标右键此电脑 xff0c 选择属性 xff1b 然后点击高级系统设置 xff0c 点击
  • Python - 字符串格式化详解(%、format)

    有人问我python的format函数怎么用 xff0c 这篇文章向大家介绍format函数用法 Python在字符串格式化的两种方式 format xff0c 关于整数的输出 o xff1a oct 八进制 d xff1a dec 十进制
  • Python 字典(Dictionary)操作详解

    这篇文章主要介绍了Python 字典 Dictionary 的详细操作方法 xff0c 需要的朋友可以参考下 Python字典是另一种可变容器模型 xff0c 且可存储任意类型对象 xff0c 如字符串 数字 元组等其他容器模型 一 创建字
  • Python中zipfile压缩包模块的使用

    本文主要介绍了Python中zipfile压缩包模块的使用 xff0c zipfile 模块提供了创建 读取 写入 添加及列出 ZIP 文件的工具 xff0c 本文做一个简单的总结 简介 ZIP 文件格式是一个常用的归档与压缩标准 xff0
  • python中@contextmanager实例用法总结

    本文是对python中 64 contextmanager的简单总结 在对于python中的装饰器 xff0c 我们一般会使用它辅助方法 在我们学习的上下文管理器中 xff0c 有一个 64 contextmanager装饰器 xff0c
  • 【Python】中文乱码问题与解决方案 深入分析

    一直以来 xff0c python中的中文编码就是一个极为头大的问题 xff0c 经常抛出编码转换的异常 xff0c python中的str和unicode到底是一个什么东西呢 xff1f 在本文中 xff0c 以 39 哈 39 来解释作
  • 004.CMake构建目标的小练习

    文章目录 HelloWorld项目与hello exeSayHello库的创建和使用查看依赖关系总结 前文说了如何使用add executable 和add library 命令定义对应的目标 xff0c 本文建立一个玩具项目 xff0c
  • swift 中错误处理

    swift 中错误处理 1 开发环境说明2 自定义错误类型3 try 的使用方式4 do catch的使用5 try 的使用方式6 defer的使用7 养眼图片一张 1 开发环境说明 系统版本 xff1a macOS Catalina 10