異常處理:
一、引入
二飞涂、異常表示
三旦部、異常處理-4種方式
四、指定清理操作
涉及關鍵字:Error throw throws try do catch
引入
比如你設計的程序需要讀取電腦中的某個文件较店,以下代碼當訪問文件出現(xiàn)問題時士八,當前沒法清楚的描述異常,無法定位錯誤的原因梁呈。所以如何來描述異常呢婚度?
func readFileContent(filePath : String) -> String? {
// 1.filePath為""
if filePath == "" {
return nil
}
// 2.filepath有值,但是沒有對應的文件
if filePath != "/User/Desktop/123.plist" {
return nil
}
// 3.取出其中的內容
return "123"
}
readFileContent(filePath: "abc")
描述異常
參考官網
在Swift里,錯誤用遵循 Error 協(xié)議的類型的值來表示;
Error是一個空的protocol官卡,它唯一的功能蝗茁,就是告訴Swift編譯器醋虏,某個類型用來表示一個錯誤。
通常哮翘,我們使用一個enum來定義各種錯誤的可能性
拋出一個錯誤用throw
通過合理定義異常颈嚼,改進上述代碼
// 1.定義異常
enum FileReadError : Error {
case FileISNull
case FileNotFound
}
// 2.改進方法,讓方法拋出異常
func readFile(filePath : String) throws -> String {
// 1.filePath為""
if filePath == "" {
throw FileReadError.FileISNull
}
// 2.filepath有值,但是沒有對應的文件
if filePath != "/User/Desktop/123.plist" {
throw FileReadError.FileNotFound
}
// 3.取出其中的內容
return "123"
}
異常處理
拋出異常后,也就是異常出現(xiàn)后饭寺,怎么處理呢阻课?
用throwing 函數(shù)傳遞錯誤
try?方式
最終返回結果為一個可選類型。如果出現(xiàn)了異常,則返回一個nil.沒有異常,則返回對應的值——》不處理異常
try!方式
告訴系統(tǒng)該方法沒有異常,一旦如果出現(xiàn)了異常,則程序會直接崩潰
do catch(建議)
var result = try? readFile(filePath: "abc")
var result = try! readFile(filePath: "abc")
do{
try readFile(filePath: "abc")
}catch{//內置變量error
print(error)
}
指定清理
在java中艰匙,我們處理異常使用 try catch finally 限煞。不管有沒有出錯,我們一般把必須要執(zhí)行的代碼放在finally里员凝。比較典型的一個場景是數(shù)據(jù)庫的操作署驻,不管是否操作成功,最后要close 釋放資源绊序。
在swift中硕舆,如果想要defer語句來實現(xiàn)。
defer語句調用時機:將離開當前代碼塊時執(zhí)行骤公,可以用它在異常中進行掃尾工作抚官,比如關閉IO流,釋放資源等
案例一:掌握defer執(zhí)行時機
do{
defer{
print("釋放資源11")
print("釋放資源12")
}
print("test1")
try readFile(filePath: "/User/Desktop/123.plist") //如果路徑為空阶捆,執(zhí)行順序如何凌节?
print("test2")
}catch{//內置變量error
print(error)
}
案例二:多個defer語句執(zhí)行順序
do{
defer{
print("釋放資源11")
print("釋放資源12")
print("釋放資源13")
}
defer{
print("釋放資源21")
}
defer{
print("釋放資源33")
}
try readFile(filePath: "/User/Desktop/123.plist")
}catch{//內置變量error
print(error)
}