之前在使用 iOS API,常會碰到要處理錯誤的狀況。比方說播放音樂要生成 AVAudioPlayer,之前會用

var myPlayer:AVAudioPlayer!
let path = NSBundle.mainBundle().pathForResource("Right" ofType:"mp3")
var err:NSError?
myPlayer = AVAudioPlayer(contentsOfURL: NSURL.fileURLWithPath(path!), 
  error: &err)

生成過程中如果發生錯誤,就會用下面的程式碼來處理錯誤的狀況。

if err != nil{
  //處理錯誤的程式碼
}

如果根本不管到底會不會出錯,在error那邊的參數,甚至可以帶入nil。不過… 不過現在 Swift2 來了,處理錯誤的過程有了不小的變動。請看本文的介紹:

SWIFT2: 自動修改功能
如果把舊的程式碼拿到 Xcode 7執行的話,Xcode會自動修改原來的程式,本來上面的程式碼,會變成下面的形式:

var myPlayer:AVAudioPlayer!
let path = NSBundle.mainBundle().pathForResource("Right" ofType:"mp3")
do{
  myPlayer = 
     AVAudioPlayer(contentsOfURL: NSURL.fileURLWithPath(path!))}
catch _ {
  myPlayer = nil
}

不改成這樣,無法執行。這個do… catch是什麼?讓我們繼續看下去…

SWIFT2: TRY,CATCH DO 與 THROW
請開一個新的Xcode專案,選Single View Application,在ViewController的class裡面加入一個新方法:

Swift2_Error_1

 

然後在 vieDidLoad方法中呼叫
Swift2_Error_2

這樣就印出了 Thomas Wei。

不過通常使用者可能會輸入各種錯誤的資料,比方說沒有輸入名字或是名字的欄位輸入數字。Swift2 為了錯誤處理,設立了一種新的機制。要使用錯誤處理的程序,就要加入 throws這個關鍵詞。請修改原來的方法名,再回傳型態之前,加上 throws,加入後,變成:

Swift2_Error_3
你會發現,一加入 throws 之後,程式就會出錯。
因為throws關鍵詞要配合 try, do 與 catch。首先先在viewDidLoad方法中、呼叫getUserFullName方法之前,加入 try。

Swift2_Error_4

加入try還不夠,還要加入do 與 catch關鍵詞,加入後就不會錯了。

Swift2_Error_5

不過這樣設定,還是沒辦法真的抓到錯誤。要處理錯誤先要定義錯誤:請在ViewController Class之前定義錯誤的型態。

Swift2_Error_6

定義好了之後,修改getUserFullName方法,在這個方法的一開始,加入有guard關鍵詞的程式碼…

Swift2_Error_7

程式碼34~35行,確保firstname與lastname一定要有值,如果沒有值的話,就丟出NameInputError.Empty的錯誤;程式碼36~37行確保firstname與lastname都不是數字,如果是數字的話,就丟出NameInputError.IsNumber的錯誤。

最後修改viewDidLoad的程式碼:

Swift2_Error_8
如果第一個參數改成1234,就會抓到NameInputError.IsNumber的錯誤,印出”輸入了數字”。這就是 Swift 2的錯誤處理。

結尾:一起來 try 與 catch 吧!
知道了上面的改變,回去查查 iOS API文件,

Swift2_Error_9
現在生成 AVAudioPlayer變成 init(contentsOfURL url:NSURL) throws,以後如果有加上throws的方法,就都要try與 catch了。所以…所以快點習慣吧!加油嚕!

 

*我是參考這個文章:https://www.hackingwithswift.com/new-syntax-swift-2-error-handling-try-catch

(3147)

superstardj

been a DJ, a rapper, a musician and a recording artist... a novel-writer, a language-book author, and a chief editor... a painter, a book-cover designer and many more... right now a programmer who designs mobile application, both iOS and Android devices...

Leave a Reply

Your email address will not be published. Required fields are marked *