本文是 swifter-tips 的筆記
異常 和 錯誤
異常
異常往往是由程序員的錯誤導致的app無法繼續(xù)運行震缭。
例如:
- 向一個無法響應某個消息的NSObject 對象發(fā)送了消息出嘹,會得到 NSInvalidArgumentException 的異常野揪,并告訴
程序員 ““unrecognized selector sent to instance” - 程序員使用一個超過數(shù)組元素數(shù)量的下標來試圖訪問 NSArray 的元素時,會得到 NSRangeException .
這種錯誤所導致的程序無法運行的問題是在開發(fā)階段就全部解決的惠啄,而不應當出現(xiàn)在上架APP中奖地。
錯誤
- 由 NSError 代表的錯誤更多的指那些 “合理的”和悦,用戶在使用app中可能遇到的情況。
例如: - 登錄時候用戶名密碼驗證后不匹配
- 試圖從某個文件中讀取數(shù)據(jù)生成 NSData 對象時發(fā)生了問題(比如文件被意外修改了)等等
但 NSError 的使用方式其實在變相的鼓勵開發(fā)者忽略錯誤榜揖。
例如:
[data writeToFile: path options: options error: nil];
在swift2.0 中 勾哩,帶有 NSError 指針作為參數(shù)的API 都被改成了可以拋出異常的形式。
open func write(toFile path: String,
options writeOptionsMask: NSData.WritingOptions) throws
使用方法為:
do {
try d.write(toFile: "Hello", options: [])
} catch let error as NSError {
print ("Error: \(error.domain)")
}
try 和 throws
try
- try举哟!標識強制執(zhí)行思劳,代表你確定知道這次調(diào)用不會拋出異常,如果調(diào)用中出現(xiàn)了移倉妨猩,程序崩潰潜叛。
- try? 返回一個Optional值,如果運行成功壶硅,沒有拋出錯誤威兜,會返回一個包含這條語句的返回值,否者返回nil
throws
- 在一個可以throw的方法里庐椒,我們永遠不應該返回一個Optional的值椒舵。
- 因為結(jié)合 try? 使用的話约谈,這個 Optional 值將再次包裝一層 Optional 笔宿,這種雙重的 Optional 值 非常容易出現(xiàn) 錯誤犁钟。也十分迷惑。
rethrows
- 和 throws 做的事情沒有太多不同泼橘,都是標記了一個方法應該拋出錯誤
- rethrows 一般用在參數(shù)中包含有可以 throws 的方法的高階函數(shù)中涝动,表示它既可以接受普通函數(shù),也可以接受一個能throw的函數(shù)作為參數(shù)炬灭。
- 可以將 rethrows 看做 throws 的 “子類”醋粟, rethrows 的方法可以用來重載那些被標記為 throws的方法或者參數(shù)〉0埽或用來滿足被標記為 throws 的協(xié)議昔穴。
- 如果不知道怎么用 :
- 記住: 在要 throws 另一個 throws 時提前,應該將前者 改為 rethrows 吗货。
- 這樣在不失靈活性的同時保證了 代碼的 可讀性和 準確性。