網站首頁 編程語言 正文
錯誤類型
1、開發過程常見的錯誤
- 語法錯誤(編譯報錯)
- 邏輯錯誤
- 運行時錯誤(可能會導致閃退,一般也叫做異常),也是我們今天講的重點
自定義錯誤
1、Swift中可以通過Error協議自定義運行時的錯誤信息
enum SomeError: Error {
case illegalArg(String)
case outOfBounds(Int, Int)
case outOfMemory
}
2、函數內部通過throw拋出自定義Error,可能會拋出Error的函數必須加上throws聲明
func divide(_ num1: Int, _ num2: Int) throws -> Int {
if num2 == 0 {
throw SomeError.illegalArg("0不能作為除數")
}
return num1 / num2
}
3、需要使用try調用可能會拋出Error的函數
4、可以使用do-catch捕捉Error
func test() {
do {
try divide(20, 0)
} catch let SomeError.illegalArg(msg) {
print("參數異常:", msg)
} catch let SomeError.outOfBounds(size, index) {
print("下標越界:", "size = \(size), index = \(index)")
} catch SomeError.outOfMemory {
print("內存溢出")
} catch {
print("其他錯誤")
}
}
5、拋出Error后,try下一句直到作用域結束的代碼都停止運行
處理Error
1、處理Error的2種方式
a、通過do-catch捕捉Error
b、不捕捉Error,在當前函數增加throws聲明,Error將自動拋給上層函數
func test() throws {
print(try divide(200, 0))
}
如果最頂層函數(main函數)依然沒有捕捉Error,那么程序將終止
以下是幾種error的處理方法:
func test() throws {
do {
print(try divide(200, 0))
} catch let error as SomeError {
print(error)
}
}
func test() throws {
do {
print(try divide(200, 0))
} catch is SomeError {
print("SomeError")
}
}
do {
try divide(20, 0)
} catch let error {
switch error {
case let SomeError.illegalArg(msg):
print("參數異常:", msg)
default:
print("其他異常")
}
}
我們通過一個例子來總結一下處理Error的2種方式:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
try test0()
}
func test0() throws -> Void {
try test1()
}
func test1() throws -> Void {
try test2()
}
func test2() throws -> Void {
do {
print(try divide(200, 0))
} catch is SomeError {
print("This is SomeError")
}
}
try?與try!
1、可以使用try?、try!調用可能會拋出Error的函數,這樣就不用去處理Error
func test() -> Void {
print("1")
var result1 = try? divide(20, 10) // Optional(2), Int?
var result2 = try? divide(20, 0) // nil
var result3 = try! divide(20, 10) // 2, Int
print("2")
}
2、a、b是等價的
var a = try? divide(20, 0)
var b: Int?
do {
b = try divide(20, 0)
} catch {
b = nil
}
rethrows
1、rethrows表明:函數本身不會拋出錯誤,但調用閉包參數拋出錯誤,那么它會將錯誤向上拋
func exec(_ fn: (Int, Int) throws -> Int, _ num1: Int, _ num2: Int) rethrows -> Void {
print(try fn(num1, num2))
}
defer
1、defer語句:用來定義以任何方式(拋錯誤、return等)離開代碼塊前必須要執行的代碼
defer語句將延遲到當前作用域結束之前執行
func open(_ filename: String) -> Int {
print("open")
return 1
}
func close(_ file: Int) -> Void {
print("close")
}
func processFile(_ filename: String) throws -> Void {
let file = open(filename)
defer {
close(file)
}
try divide(20, 0)
}
2、defer語句的執行順序與定義順序相反
func fn1() -> Void {
print("fn1")
}
func fn2() -> Void {
print("fn2")
}
func testDefer() -> Void {
defer {
fn1()
}
defer {
fn2()
}
} //fn2 fn1
原文鏈接:https://blog.csdn.net/run_in_road/article/details/126131960
相關推薦
- 2022-05-23 如何使Python中的print()語句運行結果不換行_python
- 2022-03-31 SQL?Server的觸發器詳解_MsSql
- 2022-09-25 C#基礎--特殊的集合
- 2022-06-02 React中的Props類型校驗和默認值詳解_React
- 2022-05-14 C++使用new和delete進行動態內存分配與數組封裝_C 語言
- 2022-10-22 C#抽象類的用法介紹_實用技巧
- 2022-12-28 C++?Boost?Archive超詳細講解_C 語言
- 2022-10-29 CSS實現單行、多行文本溢出顯示省略號的實現方法
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支