錯誤處理(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...