錯誤處理是響應錯誤以及從錯誤中恢復的過程。swift提供了在執行對可恢復錯誤丟擲、捕獲、傳送和操作的高階支援(錯誤處理又稱之為異常處理)。
某些操作並不能總是保證執行所有**都可以執行或總會產生出有用的結果。可選型別用來表示值可能為空,但當執行失敗的時候,通常要去了解此次失敗是由什麼引起的,**就可以做出與之對應的反應。
例如,對磁碟上的某個檔案的讀取操作,該任務會有多種可能失敗的情形,包括指定路徑下檔案不存在,檔案沒有可讀許可權,或檔案的編碼格式不相容。具體區分這些錯誤,可以讓程式解決並處理對應的錯誤,解決不了的錯誤即可以報告給用於。
在swift中,錯誤要遵循errortype
協議型別的值來表示。這個協議表示一種可以用做錯誤處理的型別。swift的列舉型別特別適合於建立一組相關錯誤,而列舉的關聯值還可以提供額外的資訊,表示錯誤情形的性質。
// 例如去健身房,下面是影響去健身房的情形
enum myerror:errortype
在swift中有4種錯誤處理方式: 把函式丟擲的錯誤傳遞給呼叫此函式的**、用do-catch
語句處理錯誤、將錯誤作為可選型別處理、直接斷言此錯誤根本不會發生。
enum myerror:errortype
// 丟擲異常(throwing函式)
func checkkeepfit(power:int, time:int, machine:int) throws
guard time > 0 else
guard machine > 0 else
}// 呼叫checkkeepfit函式(即在此函式中處理異常)
func gotokeepfit(power:int, time:int, machine:int)
// 函式呼叫
gotokeepfit(0, time: 1, machine: 1)
輸出結果:
---------
// 呼叫checkkeepfit函式(即在此函式中處理異常)
func gotokeepfit(power:int, time:int, machine:int) catch myerror.nopower catch myerror.notime catch myerror.nomachine catch
}gotokeepfit(0, time: 1, machine: 1)
輸出結果:
沒有體力
enum myerror:errortype
// 判斷是否為正數
func isplus(a:int) throws -> int
return a
}// 如果`isplus`丟擲異常,那麼x值就是為`nil`
// 否則就是該函式的返回值
let x = try? isplus(10)
// 注意: x自動推斷是為可選型別
print(x!)
// 這裡就是保證y肯定就是不為負數
let y:int
do catch
print(y)
輸出結果:
100
例如使用`loadimage(_:)`函式,該函式即是從給定路徑中載入資源,如果不能被載入則會丟擲乙個錯誤。而和應用是繫結在一起的,應用程式執行時不會有錯誤被丟擲,所以可以讓錯誤傳遞失敗
// 該位址是虛擬的
let photo = try! loadimage("./user/endevent/head.png")
可以使用defer
語句在**執行到要離開當前**段之前,再去執行一段**。該**能夠執行必要清理操作,不管是以何種方式離開當前的**段(不論是丟擲錯誤離開還是return
或是break
語句)。
// 檔案處理
func processfile(filename:string) throws
while let line try file.readline()
// 處理完成,將關閉檔案描述符
close(file)
}}
注意: 即是沒有涉及到錯誤處理**,也可以使用defer
語句。
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...