Swift基礎 — 錯誤處理 Try Try? Try!

ChunYi LI
One Two Swift
Published in
6 min readJul 6, 2018
Try Try? Try! 頭好痛啊

學習Swift一陣子,一直很懶得面對 Error Handling,因為感覺很麻煩、在學習初期也不是這麼常遇到。

但隨著學習的日子的累積,這傢伙的出現機率也越來越高,啊….是時候要面對這個東西了啊….

Error Handling — 錯誤處理

假設我今天要泡一個泡麵,標準的執行順序應該為

1. 打開泡麵包裝
2. 打開調味料包,並加入泡麵碗中
3. 沖入熱水並等待 3 分鐘即可食用

在這幾個簡單的步驟中也是會有出現錯誤的風險,有可能我根本沒有打開包裝就加入熱水、或是我加入的不是熱水而是冰水、或者我根本沒有等到3分鐘就開始吃了。

以程式開發來說,這些錯誤風險更是每日與我們為伍,錯誤處理在此時就是幫助開發者更有效率地找出錯誤,並加以改善。

以開發者來說,錯誤不可怕,可怕的是當錯誤發生時,我們還渾然不知。

起初不太需要 Error Handling 是因為我們用到的 api 都是很基礎的,不太會有需要 Handle Error 的時候,但隨著使用的api越來越多、功能越來越強大,其出現的機會也大幅增加。

最近一次遇到的時候是課堂上我們正要解一個Json資料時,程式碼如下

這裡的 Error Handling 就是那個 try。

這時初學者會被 Error Handling 的 try try? try! 搞得暈頭轉向。
所以在本次的分享你將會認識到以下

1 什麼時候才要 Error Handling ?

2 try try? try! 的差別

3 try try? try! 的使用時機

開工!

什麼時候才要 Error Handling ?

以各位敏銳的觀察力會發現,所有會需要 Error Handling 的 function 中都有一個關鍵字。如以下

throws

這些 api 都擁有這個關鍵字 throws ,代表使用這些方法的時候要特別小心,因為一個使用不慎,這些方法會 throws ( 拋 )出錯誤來。

前文有提到,當這些方法拋出錯誤時,我們可以適時的印出這些錯誤來讓開發者知道錯誤是如何發生的,而這些錯誤是由寫這些 api 的開發者所訂定。

當然,我們也可以自訂一個會拋出錯誤訊息的 function 。

在這個範例中我們就可以在想要的地方拋出我們自己自定義的錯誤。之後就換 try 出場。

try try? try! 的差別

我將用這個範例來講解 try try? try! 的差別

analyzeEven() 是一個判斷輸入的東西是不是偶數的方法,如果輸入 nil 會出現錯誤訊息 isEmpty 、輸入的東西不是整數會出現錯誤訊息 isnotInt 、 輸入的不是偶數會跳出 isnotEven。

try

雖說是 try, 但事實上是跟傳統 try catch 很像的 do try catch。

附上呼叫的程式碼

do try catch 是 Error Handling 最完整的寫法。

在使用do try catch時,我們必須將呼叫可能會拋出錯誤的方法及之後要做的事情包在 do{} 裡面,並在呼叫該方法前擺上 try 關鍵字,其後將錯誤出現時要做的事情放在 catch{}裡。

在 do try catch 中擁有catch的功能,所以可以理所當然的接到一個 error 。

範例程式翻譯成中文 :

compiler 注意喔 !我要嘗試(try)呼叫一個判斷我輸入的東西是否為偶數的方法,如果沒有錯誤的話請幫我 print 出結果訊息,如果有錯誤的話請幫我接住(catch)該方法所拋出 (throws)的錯誤訊息並且通知我是哪一種錯誤訊息。

try?

在現實世界,問號通常都代表著不確定的因素。

在 swift 的世界也是一般。

使用 try? 呼叫 analyzeEven()

由於 try? 不擁有 catch 功能,所以當方法拋出錯誤訊息時,開發者僅能得知有錯誤發生,卻不會得知錯誤訊息的種類。

翻譯成中文:

Compiler注意喔~我要呼叫一個判斷我輸入的東西是否為偶數的方法,如果有錯誤發生,你就通知我有錯誤就好,我不是很 care 是哪一種錯誤。

try!

接觸 swift 的開發者一定知道驚嘆號在 swift 的世界代表著 最快速、最暴力!

在這裡的 try! 也不遑多讓。

直接附上程式碼

最簡潔的 Error Handling 就屬 try! 莫屬。但伴隨著執行錯誤的風險。所以在使用時要特別小心,會使用 try! 通常都是開發人員非常非常確定不會有錯誤產生的時候。

翻譯成中文:

Compiler 注意!我要讓 analyzeEven() 回傳的 String 直接指派給 resultString ,不用管他會不會出錯直接印出來!

try try? try! 的使用時機

try

當開發者需要很完整的錯誤訊息,或是依據每個所拋出的錯誤的差異而有不同的事情要做時。

try?

當開發者必須做 Error Handling 時,又不太需要知道錯誤的種類,只需要知道有錯誤發生,並依照開發的需求適當的處理錯誤發生時要做的事情。

try!

當開發者非常、非常、非常確定絕對不會有錯誤產生,但又必須要做 Error Handling 時使用。

好!這就是今天的紀錄分享,希望透過這篇的 Error Handling 可以讓你在開發上遇到需要 Handle 時可以 Handle 得住。

最近把Medium轉換成 Publication ,希望藉由這種部落格形態可以讓更多的人可以看到我分享的文章。
但還是要提醒自己的是不要為了瀏覽人數讓自己變成標題黨或是內容農場文章的作者,記住自己的初衷是藉由分享觀點讓跟我一樣是初學的開發者或是有需求的開發者可以透過簡單的文字來吸收Swift的觀念。

--

--

ChunYi LI
One Two Swift

Hi this is Chunyi-Li from Taiwan, a junior iOS deveoper