Swift2.0-異常處理(Exception handler)
前言
關於我們為什么要使用異常處理,請看百度百科為我們作出的描述,想要更詳細的資料請點這里
異常處理,英文名為exceptional handling, 是代替日漸衰落的error code方法的新法,提供error code 所未能具體的優勢。異常處理分離了接收和處理錯誤代碼。這個功能理清了編程者的思緒,也幫助代碼增強了可讀性,方便了維護者的閱讀和理解。 異常處理(又稱為錯誤處理)功能提供了處理程序運行時出現的任何意外或異常情況的方法。異常處理使用 try、catch 和 finally 關鍵字來嘗試可能未成功的操作,處理失敗,以及在事后清理資源。
異常處理,是編程語言或計算機硬件里的一種機制,用於處理軟件或信息系統中出現的異常狀況(即超出程序正常執行流程的某些特殊條件)。
它有功能強大的控制流語句,像`do`、`try`、`catch`、`guard`和`defer`。我們能夠使用這些關鍵字去操控我們的代碼,更精確地執行我們的代碼。
以上摘自百度百科:
關聯,在Objective-C
中,異常處理一般都是使用NSError
類接收異常和拋出異常,使用方法像這樣
NSError *error = nil;
NSString *string = [[NSString alloc] initWithContentsOfFile:@"filePath" encoding:NSUTF8StringEncoding error:&error];
if (error != nil) {
// Exception handle
NSLog(@"Erorr is %@", error);
}
// Code...
不得不說,Swift
的異常處理更為優雅,下面會重點介紹。
Demo
你可以在github
上下載這個示例Demo
構建異常類型
我們可以構建自己的異常類型,它只是一個枚舉,遵循ErrorType
,像是這樣
enum MyErrorHandling: ErrorType {
case error1
case error2
}
定義函數可拋出異常
這里值得一提的是,只有函數才能夠拋出異常。我們需要在參數后和返回值前加上throws
關鍵字,並用guard
捕捉異常,用throw
拋出異常。
func myLoad(item: String?) throws -> String {
guard let newItem = item else {
throw MyErrorHandling.error1
}
return newItem
}
guard:
guard
必須與else
配合使用,只有當guard
審查的條件成立,guard
之后的代碼才會執行,否則拋出異常。
捕獲/處理異常
我們使用do-try-catch
去獲取並處理異常
do {
try myLoad(nil)
} catch {
print("error")
}
如果只包含一個catch
語句,那么所有的錯誤都會在這個catch
中執行,我們能夠捕抓其錯誤信息
do {
try myLoad(nil)
} catch let error as NSError {
print(error)
}
我們在使用catch
時,它是能夠進行模式匹配的,我們能夠進行更精准的錯誤匹配處理
do {
try myLoad("test")
} catch MyErrorHandling.error1 {
print("error1")
} catch MyErrorHandling.error2 {
print("error2")
}
如果我們不需要捕抓錯誤,那么我們可以使用try!
或try?
去執行該函數
try? myLoad(nil)
不建議使用
try!
,使用try?
會更加安全。因為如果當有錯誤捕抓到時,程序會直接崩潰
Defer(延遲執行)
那么我們何時需要使用到defer
?這里使用官方的例子,比如我們需要讀取某文件內容並處理,你需要打開這個文件,最后你需要關閉這個文件。當一切順利的時候,程序一直往下運行,文件也將會被關閉。那么當中間出現一些錯誤呢?例如在某個環節執行失敗了,但是你依然是需要去關閉該文件,在此defer
就表現得很強大了。在這個例子中,我們可以把關閉文件的代碼放到defer
里面,在defer
里的代碼無論是函數執行成功或失敗都會被執行。
func myLoad(item: String?) throws -> String {
defer {
print("Handle 1")
}
defer {
print("Handle 2")
}
guard let newItem = item else {
throw MyErrorHandling.error1
}
return newItem
}
需要注意的是,
defer
語句可以有多個,它們的執行順序是Handle 1
->Handle 2
。不難理解,它們的執行順序是先進后出的。
這里再說一下,你可以在github
上下載這個示例Demo
聲明
博文作者:GarveyCalvin
博文出處:http://www.cnblogs.com/GarveyCalvin/
本文版權歸作者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文鏈接,謝謝合作!