enum
customerror
:error
定義乙個測試用的類
class
testerrorclass
name = s;
}func
showstring()
}
第一種使用方式,執行**後,直接丟擲異常,中止執行:
let tes =
trytesterrorclass
(s:""
)
執行結果:
__lldb_expr_123.customerror.error1
第二種使用方式,將try換成try? 執行**後,tes返回nil,後續**繼續執行:
let tes =
try?
testerrorclass
(s:""
)if tes ==
nilelse
執行結果:
error:tes is nil.
修改一下testerrorclass,讓其丟擲的異常使用帶引數的error3
class
testerrorclass
name = s;
}func
showstring()
}docatch
customerror
.error1
catch
customerror
.error2
catch
customerror
.error3
(let str)
當執行到 let tes = try testerrorclass(s:"") 這行語句時,產生了異常,直接跳轉到catch 去匹配一致的錯誤型別後,執行對應的**斷.執行結果如下:
customerror.error3: 名字不能為空
如果不需要做型別區分處理,可以用以下方式:
do
catch
iscustomerror
這種情況下只要屬於customerror都會執行到該分支**,執行結果如下:
customerror...
如果將try?加到do…catch 會如何呢,其實就相當於永完不會catch到異常一樣,因為直接返回nil值了,系統也會給給出警告提示.
當有些異常在測試**時是已經知道的,並且不想帶有提示和警告,可以使用try! 慎用。。。
比如上面的例子,呼叫testerrorclass的地方是乙個函式,這樣的放在,這個函式也要定義為可能丟擲異常
如果你非常確定這個 testfunc在正式環境使用中,是不可能產生異常的,那可以改為下面這樣:
func
testfunc()
testfunc
()
使用 defer語句,可以保證在**執行完離開當前**塊前最後執行的語句合集,包括有異常產生的情況.
enum
fileerror
:error
class
testerrorclass
func
readfile
(filename:
string
)throws
->
string
print
("讀取檔案........")do
catch
isfileerror
return
"讀取的全部內容"}}
let t =
testerrorclass()
let c =
try? t.
readfile
(filename:
"abc.txt"
)
執行結果如下:
開啟檔案........
讀取檔案........
讀取檔案發生了異常.
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...