你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 從零開始學Swift學習筆記(Day55)使用try?和try!區別

從零開始學Swift學習筆記(Day55)使用try?和try!區別

編輯:IOS開發綜合
  • 在使用try進行錯誤處理的時候,經常會看到try後面跟有問號(?)或感歎號(!),他們有什麼區別呢?

    1.使用try?

    try?會將錯誤轉換為可選值,當調用try?+函數或方法語句時候,如果函數或方法拋出錯誤,程序不會發崩潰,而返回一個nil,如果沒有拋出錯誤則返回可選值。

    示例代碼如下:

    //查詢所有數據方法
    
    func findAll() throws -> [Note] {    
    
        guard listData.count > 0 else {
    
            //拋出"沒有數據"錯誤。
    
            throw DAOError.NoData
        }
        return listData
    } 
    
    let datas  = try? findAll()  
     
    
    print(datas)
    

     

    上述代碼中let datas = try? findAll()語句中使用了try?,datas是一個可選值,本例中輸出nil。使用了try?語句沒有必要使用do-catch語句將其包裹起來。

    2.使用try!

    使用try!可以打破錯誤傳播鏈條。錯誤拋出後傳播給它的調用者,這樣就形成了一個傳播鏈條,但有的時候確實不想讓錯誤傳播下去,可以使用try!語句。

    修改上述代碼如下:

     

    //查詢所有數據方法
    
    func findAll() throws -> [Note] {
    
        
    
        guard listData.count > 0 else {
    
            //拋出"沒有數據"錯誤。
    
            throw DAOError.NoData
    
        }
    
        return listData
    
    }
    
     
    
    func printNotes() {
    
        
    
        let datas  = try! findAll()       ①
    
        for note in datas {
    
            print("date : (note.date!) - content: (note.content!)")
    
        }
    
    }
    
    printNotes()                         ②
    

     

    代碼printNotes()函數沒有聲明拋出錯誤,在調用它的時候不需要try關鍵字,錯誤傳播鏈條在printNotes()函數內被打破了。

    代碼將try dao.findAll()語句改為try! findAll(),在try後面加了感歎號(!),這樣編譯器就不會要求printNotes()方法聲明拋出錯誤了,try!打破了錯誤傳播鏈條,但是如果真的發生錯誤就出現運行期錯誤,導致程序的崩潰。

    所以使用try!打破錯誤傳播鏈條時,應該確保程序不會發生錯誤。

     

    1. 上一頁:
    2. 下一頁:
    蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
    Copyright © Ios教程網 All Rights Reserved