亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

窺探Swift編程中的錯誤處理與異常拋出

 更新時間:2016年02月26日 11:50:19   作者:青玉伏案  
本文給大家整理些關于Swift編程中的錯誤處理與異常拋出,本文介紹的非常詳細,基于參考價值,特此分享腳本之家平臺供大家學習

在Swift 2.0版本中,Swift語言對其錯誤處理進行了新的設計,當然了,重新設計后的結果使得該錯誤處理系統(tǒng)用起來更爽。今天的主題就是系統(tǒng)的搞一下Swift中的錯誤處理,以及看一下Swift中是如何拋出異常的。在編譯型語言中,錯誤一般分為編譯錯誤和運行時錯誤。我們平時在代碼中處理的錯誤為運行時錯誤,我們對異常進行處理的操作的目的是為了防止程序出現(xiàn)錯誤而導致其他的副作用,比如用戶數(shù)據(jù)未保存等等。

在今天的文章中,先給出主動產生異常的幾種情況,然后再給出如何處理被動異常。

一、主動退出程序的幾種情況

在Objective-C中,在單元測試時我們會使用斷言,斷言中條件滿足時會產生異常,并打印出相應的斷言錯誤,在Swift中也有幾種產生異常的語法。在本篇博客的第一部分就給出這幾種方法。

1.Fatal Errors(致命的錯誤)

使用fatalError()函數(shù)可以立即終止你的應用程序,在fatalError()中可以給出終止信息。使用fatalError()函數(shù),會毫無條件的終止你的應用程序,用起來也是比較簡單的,就是一個函數(shù)的調用。下方這個Demo一目了然呢,在此就不做過多贅述了。


2. Assertions(斷言)

在單元測試中是少不了斷言的,Swift中的斷言和Objective-C的區(qū)別不是太大,使用方法也是大同小異。下方就是斷言的兩種方法,由代碼提示可知,在斷言中的提示條件是可選的。斷言會在Debug模式下起作用,但是在Release版本中就會被忽略。


在assert()函數(shù)中, 第一個參數(shù)是Bool類型,第二個參數(shù)是輸出的信息。當條件為true時,斷言不執(zhí)行,相應的斷言信息不打印。當條件為false時,斷言執(zhí)行,并且打印相應的斷言信息。


assertionFailure()函數(shù)只有一個Message參數(shù),并且該參數(shù)也是可以省略的,assertionFailure()沒有條件。如下所示:


3. 先決條件(Preconditions)

Preconditions的用法和斷言一樣,不過有一點需要主要,Preconditions在debug和release模式下都會被執(zhí)行,除非使用–Ounchecked進行編譯。下方截圖是代碼提示給出的Preconditions函數(shù)的提示,如下所示:

關于Preconditions的具體用法請參照斷言,和斷言用法一樣,在此就不做過多的贅述了。

二.Swift中的錯誤處理

在Objective-C中,如果你處理過錯誤的話,那么你將會對NSError很熟悉。在Swift中,如果你要定義你自己的錯誤類型,你只需要實現(xiàn)ErrorType協(xié)議即可。聲明完錯誤類型后,就可以在處理錯誤拋出異常時使用自定義的錯誤類型了。下方將會一步步帶你走完Swift中的錯誤處理的路程。

1.使用枚舉創(chuàng)建錯誤類型

(1).遵循ErrorType協(xié)議,自定義錯誤類型。下方定義了一個錯誤類型枚舉,該枚舉遵循了ErrorType協(xié)議,在接下來的代碼中我們將會使用這個MyCustomErrorType枚舉,錯誤枚舉的實現(xiàn)如下所示:

 //定義錯誤類型
 enum MyCustomErrorType: ErrorType {
 case ErrorReason
 case ErrorReason
 case ErrorReason
 } 

(2).在我們的函數(shù)定義時可以使用throws關鍵字,以及在函數(shù)中使用throw關鍵字對錯誤進行拋出,拋出的錯誤類型就可以使用上面我們自己定義的錯誤類型。下方函數(shù)就是一個可以拋出錯誤的函數(shù),拋出的錯誤就是我們在上面枚舉中所定義的類型。具體代碼如下所示:

 func myThrowFunc() throws {
 let test:Int? = nil
 guard test != nil else {
 throw MyCustomErrorType.ErrorReason
 }
 }

(3).上面函數(shù)的功能是對錯誤進行拋出,接下來就該使用do-catch來處理拋出的錯誤。使用try對錯誤進行捕捉,使用do-catch對錯誤進行處理。具體處理方式如下所示。在下方錯誤處理中類似于switch-case語句,catch后邊可以枚舉匹配錯誤類型,具體如下所示:    


(4)在枚舉實現(xiàn)錯誤類型中我們可以通過值綁定的形式為錯誤添加錯誤代碼和錯誤原因。在聲明枚舉時,我們使用了枚舉元素值綁定的特性(關于枚舉使用的更多細節(jié)請參考之前的博客《窺探Swift之別樣的枚舉類型》)。在聲明枚舉成員ErrorState時,我們?yōu)槠浣壎藘蓚€變量,一個是錯誤代碼errorCode, 另一個是錯誤原因errorReason。這兩者可以在拋出錯誤時為其傳入相應的值,如下方代碼片段中的throwError函數(shù)所示,在拋出錯誤是為errorCode指定的錯誤代碼為404,為errorReason指定的錯誤原因是“not found”。

  最后就是使用do-catch處理異常了,在catch中對綁定的錯誤代碼和錯誤原因進行了獲取,并且通過where子句進行了錯誤代碼的篩選。此處catch的用法與switch-case中獲取枚舉綁定值的用法是一樣的,所以在此就不做過多的贅述。具體實現(xiàn)方式如下代碼所示:


2.使用結構體為錯誤處理添加Reason

在上面的內容中,使用枚舉遵循ErrorType協(xié)議的方式定義了特定的錯誤類型。接下來我們將使用結構體來遵循ErrorType協(xié)議,為錯誤類型添加錯誤原因。也就是說,我們可以在拋出錯誤時,給自定義錯誤類型提供錯誤原因。該功能在開發(fā)中是非常常用的,而且用起來也是非常爽的。接下來就看一下如何為我們的錯誤類型添加錯誤原因。

(1)使用結構體創(chuàng)建錯誤類型,下方名為MyErrorType的結構體遵循了ErrorType協(xié)議,并且在MyErrorType結構體中,聲明了一個reason常量,該reason常量中存儲的就是錯誤原因,具體實現(xiàn)方式如下:

 struct MyErrorType: ErrorType {
 let reason : String
 }

(2)上面定義完錯誤類型結構體后,在錯誤拋出中就可以使用了。在錯誤拋出時,可以傳入一個錯誤原因,具體代碼如下所示:

 func myThrowFunc() throws {
 let test:Int? = nil
 guard test != nil else {
 throw MyErrorType(reason: "我是詳細的錯誤原因,存儲在error中")
 }
 } 

(3)最后要對拋出的錯誤進行do-catch處理,在處理時,可以對錯誤原因進行打印,錯誤原因存儲在error中,具體操作和打印結果如下所示:      

由上面的輸出結果可知,error是我們自定義的MyErrorType類型,我們可以使用下面的代碼來代替catch中的print語句,如下所示:    


上面的做法似乎有些麻煩,還有一種簡化輸出的方法,就是在上述結構體中實現(xiàn)CustomDebugStringConvertible協(xié)議,對描述信息進行一個重寫,就可以在打印error時,只打印錯誤信息,下方是重寫后的結構體?!  ?/p>

 struct MyErrorType: ErrorType,CustomDebugStringConvertible {
 let reason : String
 var debugDescription: String {
 return "錯誤類型-----\(self.dynamicType): \(reason)"
 }
 } 

修改后,輸出結果如下,直接打印error輸出的就是錯誤信息,而不是MyErrorType類型。


3.使String類型遵循ErrorType協(xié)議,直接使用String提供錯誤原因

在“2”中,我們使用了結構體遵循ErrorType協(xié)議的形式,來為錯誤提供錯誤信息的。在接下來的部分,我們將通過更為簡單的方式為拋出的錯誤提供錯誤信息。這種方式更為簡單,也易于理解,具體方式如下方代碼所示:    


三、在錯誤處理中使用內置關鍵字

1.初探這些內置關鍵字

在Swift中提供了一些內置關鍵字(__FILE__, __FUNCTION__, __LINE__等)來獲取上下文信息,在本篇博客的第三部分,將會給出如何在我們的錯誤處理中使用這些內置關鍵字。下方就是這些內置關鍵字的作用,如下所示:

上面說是內置關鍵字,其實就是存儲代碼上下文的宏定義,上方代碼段簡單的給出了這些內置關鍵字的作用與用法,在接下來將在ErrorType中使用這些內置關鍵字,讓我們的錯誤信息更加豐富多彩?!?/p>

2.在ErrorType中使用上述內置關鍵字

如果想在ErrorType中使用這些上下文內置關鍵字,我們只需要對ErrorType進行擴展,使其在ErrorType提供錯誤信息時給出出錯的上下文信息。當然,這實現(xiàn)起來比較簡單,就是在ErrorType中添加了一個擴展方法contextString()。該方法的作用就是提供錯誤的上下文信息,也就是在出錯的地方,調用contextString()方法生成上下文描述信息即可。對ErrorType協(xié)議的具體延展實現(xiàn)如下代碼段所示.

在下方代碼片段中,我們對ErrorType進行了擴展,為ErrorType添加了contextString的函數(shù)實現(xiàn)。contextString()函數(shù)有三個默認參數(shù),分別是file--當前文件名,function--當前出錯的函數(shù)名,line--當前拋出異常的行數(shù)。上述三個參數(shù)都有參數(shù)默認值,分別對應著__FILE__, __FUNCTION__, __LINE__。該擴展函數(shù)的返回值為這三個參數(shù)組成從字符串信息。具體實現(xiàn)如下所示:


3.使用擴展的contextString方法

上面我們使用結構體實現(xiàn)ErrorType協(xié)議的形式,為錯誤類型添加錯誤原因。接下來我們將在添加reason的同時,使用contextString()函數(shù)添加描述信息。下方CustomErrorType結構體遵循了ErrorType協(xié)議,其中添加了一個reason常量來存儲錯誤原因,一個context常量來存儲上下文信息,并且為該結構體添加了一個構造函數(shù),在構造函數(shù)中初始化和reason常量。具體實現(xiàn)如下所示:  


4. 拋出并捕獲異常

在下方代碼中函數(shù)throwError()拋出了異常,該拋出的錯誤類型是CustomErrorType。在創(chuàng)建CustomErrorType類型實例,也就是err變量時,我們指定了錯誤原因,也就是為reason賦了一個值。在創(chuàng)建完err實例后,我們又調用延展contextString()函數(shù)獲取異常的上下文信息,并把返回的內容存儲在err實例的context屬性中。最后使用throw關鍵字拋出err實例,如下方第一部分代碼所示。

在創(chuàng)建拋出異常的函數(shù)后,我們需要對拋出的異常進行捕獲。也就是使用try對異常進行捕獲,使用do-catch對異常進行處理,具體操作如下方第二段代碼所示。

    

5. 分析打印結果

經過上述步驟如果你在Playground中進行試驗的,那么在控制臺上你將會看到如下信息。從打印出的信息我們可以看到,信息包括reason:錯誤原因,和context:異常上下文。在下方的輸出結果中,文件名我們可以看到是<EXPR>這并不是確切的文件名,因為我們是在Playground中使用的,并且不是確切的Swift源文件,所以獲取不到確切的文件名。

為了觀察確切的文件名,我們需要在確切的Swift源文件中拋出上述異常。在特定Swift源文件中,我們會看到下方的輸出結果。從下方的輸出日志中,我們可以清楚的看到文件名是一個詳細的文件路徑。如下所示:    


關于本文給大家介紹的Swift編程中的錯誤處理與異常拋出就給大家介紹到這里,以后再做小demo時,如何用到其他的錯誤處理方式,在給大家詳解介紹。謝謝大家對腳本之家網站的支持!

相關文章

  • Swift中使用可選類型完美解決占位問題

    Swift中使用可選類型完美解決占位問題

    這篇文章主要介紹了Swift中使用可選類型完美解決占位問題,本文講解了為Dictionary增加objectsForKeys函數(shù)、Swift中更簡便的方法、內嵌可選類型等內容,需要的朋友可以參考下
    2015-05-05
  • Swift編程中的初始化與反初始化完全講解

    Swift編程中的初始化與反初始化完全講解

    這篇文章主要介紹了Swift編程中的初始化與反初始化完全講解,是Swift入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • SwiftUI中TabView組件的常規(guī)使用

    SwiftUI中TabView組件的常規(guī)使用

    這篇文章主要給大家介紹了關于SwiftUI中TabView組件的常規(guī)使用,文中通過實例代碼介紹的非常詳細,對大家學習或者使用SwiftUI具有一定的參考學習價值,需要的朋友可以參考下
    2022-06-06
  • Swift教程之類與結構詳解

    Swift教程之類與結構詳解

    這篇文章主要介紹了Swift教程之類與結構詳解,本文講解了類和結構的異同、結構和枚舉類型是數(shù)值類型、類是引用類型、如何選擇使用類還是結構、集合類型的賦值和復制操作等內容,需要的朋友可以參考下
    2015-01-01
  • Swift中定義單例的方法實例

    Swift中定義單例的方法實例

    Swift中單例的寫法有很多種,下面這篇文章主要給大家介紹了關于Swift中定義單例的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • Swift中通知中心(NotificationCenter)的使用示例

    Swift中通知中心(NotificationCenter)的使用示例

    這篇文章主要給大家介紹了關于Swift中通知中心(NotificationCenter)使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10
  • Swift 常量與變量實例詳解

    Swift 常量與變量實例詳解

    這篇文章主要介紹了Swift 常量與變量實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • 利用swift實現(xiàn)卡片橫向滑動動畫效果的方法示例

    利用swift實現(xiàn)卡片橫向滑動動畫效果的方法示例

    卡片橫向滑動動畫效果相信對大家來說都不陌生,下面這篇文章主要給大家介紹了關于利用swift實現(xiàn)卡片橫向滑動動畫效果的方法示例,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Swift中的訪問控制和protected

    Swift中的訪問控制和protected

    這篇文章主要介紹了Swift中的訪問控制和protected,本文主要講解為什么Swift沒有類似protected的選項,需要的朋友可以參考下
    2015-05-05
  • Swift如何為網頁承載頁面添加更多功能詳解

    Swift如何為網頁承載頁面添加更多功能詳解

    這篇文章主要給大家介紹了關于Swift如何為網頁承載頁面添加更多功能的相關資料,包括添加菊花加載的效果、添加跳轉到Safari的功能、添加復制鏈接的功能以及添加分享網頁的功能,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-05-05

最新評論