Swift異常處理的try?與try!

2022-08-18 18:54:11 字數 2552 閱讀 3981

首先要明白丟擲異常後異常的運動:異常被丟擲後,中斷整個處理,異常不斷向外層(範圍)傳遞,直到遇到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("

測試結束")

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...