十四 錯誤處理

2021-10-24 17:32:17 字數 3138 閱讀 2251

class person

}person.age = 10

person.run()

//等價彙編**也是一樣的

person.self.age = 10

person.self.run()

//四個等價彙編**也是一樣的

var p0 = person() //init()

var p1 = person.self() //init()

var p2 = person.init() //init()

var p3 = person.self.init() //init()

func test(_ cls: anyclass) {}

test(person.self)元類型別

//1.自定義錯誤

//swift中可以通過error協議自定義執行時的錯誤資訊

enum someerror : error

//函式內部通過throw拋出自定義error,可能會丟擲error的函式必須加上throws宣告

func divide(_ num1: int, _ num2: int) throws -> int

return num1 / num2

}func test0() throws

func test1() throws

func test2() throws

//try test0()//1 3 5 //注釋掉這行test3才會執行

可以用do-catch捕捉error

func test3() catch let someerror.illegaarg(msg) catch let someerror.outofbounds(size,index) catch someerror.outofmemory catch

print("4")

}//test3()/*1

2引數異常: 0不能作為除數4*/

do catch let error

}//引數錯誤: 0不能作為除數

//3.處理error

//處理error的2中方式

//(1)通過do-catch捕捉error

//(2)不捕捉error,在當前函式增加throws宣告,error將自動拋給上層函式,如果最頂層函式(main函式)依然沒有捕捉error,那麼程式將終止

func test4() throws

//try test4()

/*引數錯誤: 0不能作為除數

1playground execution terminated: an error was thrown and was not caught:

▿ someerror

- illegaarg : "0不能作為除數"

*/func test5() throws catch let error as someerror

print("4")

}//try test5()

/*引數錯誤: 0不能作為除數12

illegaarg("0不能作為除數")4*/

//可以用try?、try!呼叫可能會丟擲error的函式,這樣就不用去處理error

func test6()

test6()

//變數a、b是等價的

var a = try? divide(20, 0)

var b: int?

do catch

print("------")

表明:函式本身不會丟擲錯誤,但呼叫閉包引數丟擲錯誤,那麼它會將錯誤向上拋

func exec(_ fn: (int, int) throws -> int, _ num1: int, _ num2: int) rethrows

//try exec(divide, 20, 0)

/*playground execution terminated: an error was thrown and was not caught:

▿ someerror

- illegaarg : "0不能作為除數"

*//*defer語句:用來定義以任何方式(拋錯誤、return等)離開**塊前必須要執行的**,defer語句將延遲至當前作用域結束之前執行

*/func open(_ filename: string) -> int

func close(_ file: int)

func processfile(_ filename: string) throws

//使用file

try divide(20, 0)

//close將會在這裡呼叫

}try processfile("test.txt")

/*open

close

playground execution terminated: an error was thrown and was not caught:

▿ someerror

- illegaarg : "0不能作為除數"

*/斷言

/*不符合指定條件就丟擲執行時錯誤,常用於除錯階段的條件判斷

預設情況下,swift的斷言只會在debug模式下生效,release模式下會忽略.

但增加swift flags修改斷言的預設行為:

-assert-config release:強制關閉斷言

-assert-config debug:強制開啟斷言

*/func div(_ v1: int, _ v2: int) -> int

//print(div(20, 0))

崩潰//如果遇到嚴重問題,希望結束執行程式時,可以直接使用fatalerror函式丟擲錯誤,這是無法通過do-catch捕捉的錯誤

func te(_ num: int) -> int

fatalerror("num 不能小於0") //使用了fatalerror就不需要寫return

}//te(-1)

//某些不得不實現、但不希望別人呼叫的方法,可以考慮內部使用fatalerror

class cat }

class tiger : cat

init(score: int) {}

}var t1 = tiger(score: 98)

//var t2 = tiger()

(十四)GORM 錯誤處理

下面介紹gorm關於錯誤的處理方式 如果在執行sql查詢的時候,出現錯誤,gorm 會將錯誤資訊儲存到 gorm.db 的error欄位,我們只要檢測error欄位就可以知道是否存在錯誤。if err db.where name tizi365 first user error err nil或者 ...

MySql錯誤處理 錯誤處理的例子

有幾種錯誤處理的宣告形式 如果任何錯誤 不是 not found 設定 l error 為 1 後繼續執行 declare continue handler for sqlexception set l error 1 如果發生任何錯誤 不是 not found 執行 rollback和產生一條錯誤...

MySql錯誤處理(三) 錯誤處理的例子

mysql錯誤處理 三 錯誤處理的例子 有幾種錯誤處理的宣告形式 如果任何錯誤 不是 not found 設定 l error 為 1 後繼續執行 declare continue handler for sqlexception set l error 1 如果發生任何錯誤 不是 not foun...