錯誤分為可恢復的錯誤和不可恢復的錯誤,可恢復的錯誤指的是能預見並處理的錯誤,例如檔案不存在,網路連線失敗等;不可恢復的錯誤指的是一類特殊的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 提供了在執行時對可恢復錯誤的丟擲 捕獲 傳遞和操作的一等公民支援。某些操作無法保證總是執行完所有 或總是生成有用的結果。可選型別可用來表示值缺失嗎,但是當某個操作失敗時,最好能得知失敗的原因,從而可以作出相應的應對...