原創(chuàng)文章,歡迎轉(zhuǎn)載习霹。轉(zhuǎn)載請注明:關(guān)東升的博客
Swift 1.x的錯誤處理模式存在很多弊端暇屋,例如:為了在編程時候省事,給error參數(shù)傳遞一個nil攘轩,或者方法調(diào)用完成后不去判斷error是否為nil叉存,不進行錯誤處理。
let contents = NSString(contentsOfFile: filePath,
?encoding: NSUTF8StringEncoding, error: nil)//error參數(shù)傳遞一個nil
或者
var err: NSError?
let contents = NSString(contentsOfFile: filePath,
?encoding: NSUTF8StringEncoding, error: &err)
不好的編程習慣度帮,由于Objective-C和Swift 1.x沒有強制處理機制歼捏,因此一旦真的發(fā)生錯誤,程序就會發(fā)生崩潰。
同樣的從文件中讀取字符串示例瞳秽,如果使用Swift 2錯誤處理模式代碼如下:
import Foundation
do { //要做一些操作
let str = try NSString(contentsOfFile: filePath,
?encoding: NSUTF8StringEncoding) //要嘗試做的事情
} catch let err as NSError { //如果失敗則進入catch代碼塊
err.description
}
do-try-catch這種錯誤模式與Java中異常處理機制非常類似瓣履,本意就是嘗試(try)做一件事情,如果失敗則捕獲(catch)處理寂诱。
捕獲錯誤
完整的do-try-catch錯誤處理模式的語法如下:
do {
try 語句
成功處理語句組
} catch 匹配錯誤 {
錯誤處理語句組
}
在try 語句中可以產(chǎn)生錯誤拂苹,當然也可能不會產(chǎn)生錯誤,如果有錯誤發(fā)生痰洒,catch就會處理錯誤瓢棒。catch代碼塊可以有多個,錯誤由哪個catch代碼塊處理是由catch后面的錯誤匹配與否而定的丘喻。錯誤類型的多少就決定了catch可以有多少脯宿。我們先介紹一下錯誤類型。
錯誤類型
在Swift中錯誤類型必須遵從ErrorType 協(xié)議泉粉,其次考慮到錯誤類型的匹配连霉,它應該被設(shè)計成為枚舉類型,枚舉類型非常適合將一組相關(guān)值關(guān)聯(lián)起來嗡靡。
如果我們編寫訪問數(shù)據(jù)庫表程序跺撼,實現(xiàn)對表數(shù)據(jù)插入、刪除讨彼、修改和查詢等操作歉井,我們會需要類似如下代碼的錯誤類型:
enum DAOError: ErrorType {
case NoData
case PrimaryKeyNull
}
NoData表示沒有數(shù)據(jù)情況,PrimaryKeyNull表示表的主鍵(Primary Key)為空情況哈误。
那么我們就可以通過如下代碼捕獲錯誤哩至。
do {
//try 訪問數(shù)據(jù)表函數(shù)或方法
} catch DAOError.NoData {
print("沒有數(shù)據(jù)。")
} catch DAOError.PrimaryKeyNull {
print("主鍵為空蜜自。")
}