Swift學習筆記 錯誤處理

2021-08-30 11:41:28 字數 3083 閱讀 9074

錯誤分為可恢復的錯誤和不可恢復的錯誤,可恢復的錯誤指的是能預見並處理的錯誤,例如檔案不存在,網路連線失敗等;不可恢復的錯誤指的是一類特殊的bug,例如強制展開值為nil的可空例項,陣列越界訪問等;如果發生錯誤沒有處理,程式就會停止執行。遺憾的是swift中似乎只能處理可恢復的錯誤。

swift中使用assert新增斷言,第乙個引數表示要檢查的條件,為true時什麼也不做,為false時停止執行並顯示錯誤資訊;第二個引數為檢查條件為false時輸出的字串資訊,預設為空;最後兩個引數為呼叫assert所在的源檔名,行號。

/// - parameters:

/// - condition: the condition to test. `condition` is only evaluated in

/// playgrounds and `-onone` builds.

/// - message: a string to print if `condition` is evaluated to `false`. the

/// default is an empty string.

/// - file: the file name to print with `message` if the assertion fails. the

/// default is the file where `assert(_:_:file:line:)` is called.

/// - line: the line number to print along with `message` if the assertion

/// fails. the default is the line number where `assert(_:_:file:line:)`

/// is called.

public

func

assert

(_ condition: @autoclosure ()-

>

bool

,_ message: @autoclosure ()-

>

string

=default

, file:

staticstring

= #file, line:

uint

= #line)

assert只有在除錯模式才有效,要想在發布模式也生效可以使用precondition,兩者用法相同

var number1=

1assert

(number1 !=1,

"number1 is 1"

)precondition

(number1 !=1,

"number1 is 1"

)

遇到錯誤時,可以使用throw丟擲乙個符合error協議的型別的例項,由於error協議是乙個空協議,所以不需要任何屬性或方法,就能實現error協議。如果該錯誤沒有被處理,則會停止執行,例如下面的**。

import

foundation

struct

xyerror

:error

throw

xyerror

()

swift中使用do…catch捕捉丟擲的錯誤,如果沒有指定錯誤型別則會捕捉所有錯誤

import

foundation

struct

xyerror

:error

docatch

也可以捕捉多個錯誤

import

foundation

enum

neterror

:error

struct

xyerror

:error

docatch

neterror

.servererror

catch

let e as

neterror

catch

let e as

xyerror

catch

在函式簽名後面加上throws表示該函式可能會丟擲錯誤,呼叫此函式時前面必須加上try,並且需要把呼叫此函式寫在do…catch內。

func

makeerror

(arg:

int)

throws

->

intreturn arg

}//編譯會報錯

func

testfunc()

//正確寫法

func

testfunc()

catch

}

如果呼叫可丟擲錯誤的函式的函式也標記為throws,那麼該函式可以不處理錯誤,錯誤將再次丟擲

func

makeerror

(arg:

int)

throws

->

intreturn arg

}func

testfunc()

throws

呼叫可丟擲錯誤的函式的函式也可以使用try!告訴編譯器不想處理潛在錯誤,出現錯誤時停止執行

func

makeerror

(arg:

int)

throws

->

intreturn arg

}func

testfunc()

try還有另外一種變體try?,可以在發生錯誤時忽略錯誤,但不會停止執行而是返回原本返回值的可空型別

func

makeerror

(arg:

int)

throws

->

intreturn arg

}func

testfunc()

python學習筆記 錯誤處理

程式中的錯誤處理有多種方式,一類是約定好錯誤碼,然後根據返回的錯誤碼來判斷是否發生錯誤,以及錯誤的原因。但是這麼做容易將正確的返回值和錯誤碼混在一起,必須要寫很多 來區分,非常不方便。另外一旦出錯,還需要一級一級往上報,知道有一級可以處理它。比較成熟的做法是try.except.finally.這一...

rust學習筆記 錯誤處理

rust的錯誤分兩種 rust提供了可恢復錯誤的型別result t,e 與不可恢復錯誤時終止執行的panic!巨集。程式會在panic!巨集執行時列印出一段錯誤提示資訊,展開並清理當前的呼叫棧,然後退出程式,這種情況大部分都發生在某個錯誤被檢測到,但程式設計師卻不知道該如何處理的時候。panic的...

Swift學習 錯誤處理

錯誤處理 error handling 是響應錯誤以及從錯誤中恢復的過程。swift 提供了在執行時對可恢復錯誤的丟擲 捕獲 傳遞和操作的一等公民支援。某些操作無法保證總是執行完所有 或總是生成有用的結果。可選型別可用來表示值缺失嗎,但是當某個操作失敗時,最好能得知失敗的原因,從而可以作出相應的應對...