IOS面试题——Swift错误处理(15)

一 面试题汇总

  1. 如何自定义错误?遵守Error协议
  2. 如何抛出异常,如何捕获异常?throw,do-catch
  3. 可以使用try?、try!调用可能会抛出Error的函数,这样就不用去处理Error
  4. 如何定义以任何方式(抛错误、return等)离开代码块前必须要执行的代码?defer
  5. fatalError有作用?可以做什么?

二 面试题解答(仅供参考)

2.1 如何自定义错误?遵守Error协议

1
2
3
4
5
6
7
8
9
10
在 Swift 中,自定义错误类型需要遵守Error协议。
Error协议是一个空协议,用于标识可以作为错误的类型。
你可以通过定义自己的枚举或结构体来创建自定义的错误类型。

总结:
1.Error 协议是一个空协议,任何遵守此协议的类型都可以作为错误类型。
2.常见做法是使用 枚举 来定义自定义错误类型,每个枚举值代表一种错误。
3.使用 throw 关键字在函数中抛出错误。
4.使用 do-catch 捕获并处理错误。
5.可以使用关联值为错误提供更多的上下文信息。

2.2 如何抛出异常,如何捕获异常?throw,do-catch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
在 Swift 中,抛出和捕获异常的机制是通过 throw 和 do-catch 来实现的。
这里的异常指的是在执行过程中可能发生的错误,通常用来处理不正常的状态,比如无效输入、网络请求失败等。

1.抛出异常 (throw):
1.1在 Swift 中,抛出异常的函数必须标明其可能会抛出错误,使用throws关键字。
1.2当函数内出现错误条件时,可以使用 throw 关键字抛出异常。

2.捕获异常 (do-catch):
2.1-使用 do-catch 语句来捕获和处理可能抛出的异常。
2.2-do 块中包含可能抛出异常的代码。
2.3-catch 块捕获并处理异常,可以针对不同类型的错误提供不同的处理方式。

3.捕获所有错误类型:如果你不关心具体的错误类型,可以使用通用的catch来捕获所有类型的错误。

4.throws 和 rethrows 的区别:
4.1-throws 用于标记一个函数可能会抛出错误。
4.2-rethrows 用于标记一个函数如果其参数是抛出错误的函数,那么它本身也可能抛出错误。

总结:
抛出异常:通过 throw 关键字抛出错误,函数需要使用 throws 来标明可能会抛出错误。
捕获异常:使用 do-catch 语句来捕获和处理抛出的错误。
do 块中执行可能抛出错误的代码。
catch 块用于捕获并处理错误,可以根据不同错误类型进行不同的处理。

2.3 可以使用try?、try!调用可能会抛出Error的函数,这样就不用去处理Error

1
2
3
4
5
6
在 Swift 中,try? 和 try! 提供了两种简化处理错误的方式,
它们使得调用可能抛出错误的函数时,可以避免显式地使用 do-catch 来捕获和处理错误。

总结:
1.try?:如果函数抛出错误,返回 nil,不会导致程序崩溃,适合在不关心错误详情的情况下使用。
2.try!:如果函数抛出错误,程序会崩溃,适合在你确定函数不会抛出错误的情况下使用

2.4 如何定义以任何方式(抛错误、return等)离开代码块前必须要执行的代码?defer

1
2
3
4
5
6
7
8
在 Swift 中,使用defer语句可以确保在当前作用域的代码块结束之前,无论是正常执行结束,
还是由于抛出错误、return 等原因提前离开代码块,都必须执行某些清理操作。
defer 是一种延迟执行的机制,通常用于资源释放、文件关闭、数据库连接断开等操作。

总结:
1.defer 语句用来保证在函数结束之前执行某些代码,常用于资源清理、关闭文件、数据库连接等操作。
2.无论函数是如何提前退出的(如抛出错误或 return),defer语句都会执行。
3.defer语句的执行顺序是 LIFO(后进先出),即最后声明的defer语句最先执行。

2.5 fatalError有作用?可以做什么?

1
2
3
4
5
6
7
8
在 Swift 中,fatalError 是一个用于终止程序执行的函数。
当程序执行到 fatalError 时,应用会立即停止,并输出一个错误信息。
通常用于代码中的不可恢复错误或开发阶段的占位符,表示某些代码路径应该永远不会被执行。

总结:
1.fatalError 用于在程序执行到不应到达的代码时立即崩溃,输出自定义的错误信息。
2.适合用于开发中的占位符,标记未实现的功能或处理不可恢复的致命错误。
3.一旦执行到 fatalError,程序将终止,并无法继续执行。

三 参考

  • 简书—Swift错误处理