Swift學習 錯誤處理

2022-03-25 19:39:43 字數 1720 閱讀 8203

錯誤處理(error handling)是響應錯誤以及從錯誤中恢復的過程。swift 提供了在執行時對可恢復錯誤的丟擲、捕獲、傳遞和操作的一等公民支援。

某些操作無法保證總是執行完所有**或總是生成有用的結果。可選型別可用來表示值缺失嗎,但是當某個操作失敗時,最好能得知失敗的原因,從而可以作出相應的應對。

舉個例子,假如有個從磁碟上的某個檔案讀取資料並進行處理的任務,該任務會有多種可能失敗的情況,包括指定路徑下檔案並不存在,檔案不具有可讀許可權,或者檔案編碼格式不相容。區分這些不同的失敗情況可以讓程式解決並處理某些錯誤,然後把它解決不了的錯誤報告給使用者。

注意swift 中的錯誤處理涉及到錯誤處理模式,這會用到 cocoa 和 objective-c 中的 nserror。

表示並丟擲錯誤

在 swift 中,錯誤用符合 error 協議的型別的值來表示。這個空協議表明該型別可以用於錯誤處理。

enum vendingmachineerror: error catch pattern 1 catch pattern 2 where condition catch vendingmachineerror.invalidselection catch vendingmachineerror.ourofstock catch vendingmachineerror.insufficientfunds(let coinsneeded) catch

if let data = try? fetchdatafromserver()

return nil

禁用錯誤傳遞

有時你知道某個 throwing 函式實際上在執行時是不會丟擲錯誤的,在這種情況下,你可以在表示式前面寫 try! 來禁用錯誤傳遞,這會把呼叫包裝在乙個不會有錯誤丟擲的執行時斷言中。如果真的丟擲了錯誤,你會得到乙個執行時錯誤。

例如,下面的**使用了 loadimage(atpath:) 函式,該函式從給定的路徑載入資源,如果無法載入則丟擲乙個錯誤。在這種情況下,因為是和應用繫結的。執行時不會有錯誤丟擲,所以適合禁用錯誤傳遞:

指定清理操作

可以使用 defer 語句在即將離開當前**時執行一系列語句。該語句讓你能執行一些必要的清理工作,不管是以何種方式離開當前**塊的--無論是由於丟擲錯誤而離開,還是由於諸如 return 或 break 語句。例如,你可以用 defer 語句來確保檔案描述符得以關閉,以及手動分配的記憶體得以釋放。

defer 語句將**的執行延遲到當前的作用域退出之前。該語句由 defer 關鍵字和要被延遲執行的語句組成。延遲執行的語句不能包含任何控制轉移語句,例如 break 或是 return 語句,或是丟擲乙個錯誤。延遲執行的操作會按照它們被指定時的順序的相反順序執行--也即是說,第一條 defer 語句中的**會在第二條 defer 語句中的**被執行之後才執行,以此類推。

func processfile(filename: string) throws {

if exists(filename) {

let file = open(filename)

defer {

close(file)

while let line = try file.readline() {

// 處理檔案

// close(file) 會在這裡被呼叫,即作用域的最後。

上面的**使用一條 defer 語句來確保 open(_:) 函式有乙個相應的對 close(_:) 函式的呼叫。

注意即使沒有涉及錯誤處理,你也可以使用 defer 語句。

end

Swift 錯誤處理

宣告列舉錯誤型別 enum printererror error 捕捉異常的五種方式 1.使用throw 來丟擲乙個錯誤 func send job int,printername string throws string return job sent 2.do catch 在 塊中執行操作,do...

Swift 錯誤處理

override func viewdidload 丟擲錯誤 throw vendingmachineerror.insufficientfunds coinsneeded 5 2.處理錯誤 swift 中有四種方式處理錯誤 1.將錯誤從乙個函式傳播 propagate 到呼叫它的 2.用 do c...

Swift 錯誤處理專題

playground noun a place where people can play import uikit 下面的三個用於除錯,在真機上不起作用 assert 1 0 必須滿足括號裡面的邏輯,不然停止 assert 1 0,error 必須滿足括號裡面的邏輯,不然停止並報錯 asserti...