首先要明白丟擲異常後異常的運動:異常被丟擲後,中斷整個處理,異常不斷向外層(範圍)傳遞,直到遇到catch**塊群,會與catch**塊的條件進行匹配,匹配符合則進入此**塊處理。如果遇到沒有條件的catch{}那麼直接在這個**裡處理。如果丟擲的異常一直到最外層仍沒有被catch{}處理,那麼程式會卡住(後面的處理全部中斷)
舉個簡單的例子,異常和丟擲異常的函式和之前博文裡的是一樣的
enum
numtest:
int,
error
func errortest(by num: int) throws -> string
}我們用這一段**來測試
print("
即將開始測試")
tryerrortest
(by:0)
print("
測試結束")
print("
因為異常沒有**捉,所以這兩句話不會執行")
執行結果如下:
即將開始測試
換言之,如果我們丟擲了異常,那就必須進行處理,不想處理?那麼就加個空的無條件的catch{},為了方便觀測效果,我們在catch裡輸出測試中
print("
即將開始測試")
docatch
print("
測試結束")
print("
因為異常**捉,所以這兩句話會執行")
執行結果如下:
即將開始測試
---測試中---
測試結束
因為異常**捉,所以這兩句話會執行
由以上測試可知,丟擲的異常必須被處理,不然異常會導致程式中斷,出現假死現象
可是,每次都要加上do-catch這一長串,無論是從**的可讀性還是寫**的角度都是非常不好的。這裡,try?與try!就可以大顯身手了
其實到這裡,相信大家也很清楚try?和try!的作用了。
沒錯,try?是乙個可選繫結,當後面執行的可以丟擲異常的函式沒有丟擲異常,則直接執行。當丟擲異常,則跳過此函式。既然是可選繫結,那麼如果用在條件裡,如果沒丟擲異常,那麼返回的值帶入宣告量(void返回的是void的空值,不是nil),如果丟擲,可選繫結判定為false,和普通的可選繫結一樣
先看下面這個例子
print("
即將開始測試")
try?
errortest
(by:0)
print("測試結束")
執行結果如下:
即將開始測試
測試結束
把try?改成try
print("
即將開始測試")
tryerrortest
(by:0)
print("
測試結束")
執行結果如下:
即將開始測試
帶入條件
fori
in0
..< 10
where
i ==3||
i ==
5else
print("
測試結束")
("-----------")}
執行結果如下:
即將開始測試
測試中,丟擲異常
測試結束
-----------
即將開始測試
測試中,沒有丟擲異常,
測試值ok 5
測試結束
-----------
最後再來看看try!,這個很明顯了,就是預設不會丟擲異常,直接執行,如果丟擲執行在編譯出錯
print("
即將開始測試")
print("
正常值:",
try!
errortest
(by:6))
print("
測試結束")
執行結果如下:
即將開始測試
正常值:ok
6
測試結束
最後總結一下,try?和try!主要用在對異常丟擲函式進行不需要捕捉異常的處理。當然,一般不建議用try!,後期容易出問題
異常處理 try與except處理異常語句
def convert numbers s try return int s except valueerror return nonetry except介紹 與其他語言相同,在python中,try except語句主要是用於處理程式正常執行過程中出現的一些異常情況,如語法錯 python作為指...
Swift處理異常的三種方式 try
方式一 try方式 程式設計師手動捕捉異常 do catch 方式二 try?方式 常用方式 系統幫助我們處理異常,如果該方法出現了異常,則該方法返回nil.如果沒有異常,則返回對應的物件 guard let anyobject try?nsjsonserialization.jsonobjectw...
Swift處理異常的三種方式 try
1 方式一 try方式 程式設計師手動捕捉異常2do catch89 方式二 try?方式 常用方式 系統幫助我們處理異常,如果該方法出現了異常,則該方法返回nil.如果沒有異常,則返回對應的物件 10 guard let anyobject try?nsjsonserialization.json...