亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

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

2020-03-09 17:49:07
字體:
來源:轉載
供稿:網友
本文給大家整理些關于Swift編程中的錯誤處理與異常拋出,本文介紹的非常詳細,基于參考價值,特此分享VEVB武林網平臺供大家學習
 

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

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

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

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

1.Fatal Errors(致命的錯誤)

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

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

2. Assertions(斷言)

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

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

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

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

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

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

3. 先決條件(Preconditions)

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

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

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

二.Swift中的錯誤處理

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 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中,具體操作和打印結果如下所示:      

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

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

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

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

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

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

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

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

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

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

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

1.初探這些內置關鍵字

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

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

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

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

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

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

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

3.使用擴展的contextString方法

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

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

4. 拋出并捕獲異常

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

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

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

5. 分析打印結果

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

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

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

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

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



注:相關教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
中文字幕色呦呦| 天堂久久久久va久久久久| 欧美激情精品久久| 91麻豆精品国产91久久久更新资源速度超快| 国产精品日韩欧美综合| 91超碰国产精品| 亚洲青涩在线| 国产无套粉嫩白浆内谢的出处| 91文字幕巨乱亚洲香蕉| 好男人www社区| 日韩欧美电影一区| 男人天堂综合网| 黄色免费视频观看| 国产一区二区成人久久免费影院| ass白嫩白嫩的小美女| 欧美h视频在线观看| 农村少妇久久久久久久| 人妻激情偷乱频一区二区三区| www.日本不卡| 精品视频高清无人区区二区三区| 免费成人深夜夜行视频| 91色中文字幕| 粗大黑人巨茎大战欧美成人| 日本不卡不码高清免费观看| 成人小视频在线观看免费| 久久精品成人欧美大片| 亚洲综合av一区二区三区| 欧美视频在线观看免费| 亚洲AV无码精品自拍| 天堂在线中文网官网| 538在线一区二区精品国产| 高清福利在线观看| 天天舔夜夜操| 在线观看av网| 夜色资源网av在先锋网站观看| 羞羞的视频在线看| 国产福利在线视频| 免费观看成年人视频在线观看| 亚洲欧洲av一区二区三区久久| 亚洲一区在线免费观看| 免费黄视频网站| 中文字幕av资源一区| 美女黄色网址| 亚洲综合在线视频| 中文字幕亚洲乱码熟女1区2区| 欧美日韩亚洲精品内裤| 亚洲男人天堂2017| 亚洲国产成人精品视频| 欧美日韩一区中文字幕| 欧美激情综合网| 日本国产在线观看| 精品国产美女a久久9999| 国产亚洲欧美久久久久| 日韩影院免费视频| www.四虎网站| 色婷婷国产精品免| 亚洲国产精品一区二区第一页| 成人午夜看片网址| 在线精品国精品国产尤物884a| 亚洲人体av| 日韩欧美少妇| 亚洲一二三在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅| 波多野结衣三级在线| 国产精品欧美亚洲| 国产一区深夜福利| 青娱在线视频| 国产主播一区二区| 天堂资源在线| 日本不卡一区在线| 94色蜜桃网一区二区三区| 成人午夜免费影院| 黄色成人av网站| 久久av资源| 国产在线黄色片| 99精品网站| 亚洲一级淫片| 在线满18网站观看视频| 99国产精品免费视频观看| 国产免费一区二区三区免费视频| 亚洲视频分类| 久久av资源网| 亚洲国产果冻传媒av在线观看| 丝袜亚洲另类欧美| 大片在线观看网站免费收看| 91精选在线观看| www.黄色网址| 亚洲三区在线| 欧美激情网站在线观看| 91精品国产色综合| 成人免费视频在线观看| 日韩av有码在线| 亚洲怡红院在线观看| 国内精品久久久久久野外| 国产精品v欧美精品∨日韩| 视频一区在线免费看| 欧美人与动牲交xxxxbbbb| 亚洲欧美国产精品久久久久久久| 精品999久久久| 2019亚洲男人天堂| 国模人体一区二区| 一本色道a无线码一区v| 免费在线亚洲欧美| 国产成人高清在线| 精品无码人妻一区二区三区品| 少妇精品放荡导航| av毛片午夜不卡高**水| 国产娇喘精品一区二区三区图片| 亚洲激情图片小说视频| 国产一区二区观看| 中国一级大黄大黄大色毛片| 一级欧美一级日韩片| 国产精品国产精品88| 日韩有码一区二区三区| 欧美一级二级视频| 日韩精品视频在线观看一区二区三区| 欧美极品欧美精品欧美图片| 日本一区二区三区dvd视频在线| 天天色天天上天天操| 欧美日韩一区二区免费视频| 麻豆精品视频在线观看| 久久久久久久久97| 久久综合激情网| 欧美激情在线观看视频免费| 人人插人人射| 国产精品成人免费电影| 色就是色欧美色图| 日本亚洲欧美三级| 黄色精品免费看| 亚洲第九十七页| 久久奇米777| 日韩中文字幕1| 特级毛片在线| 精品毛片乱码1区2区3区| 日韩亚洲欧美一区二区三区| 精品日韩一区二区三区免费视频| 日韩一区二区三区高清| 久久国产在线观看| 国产亚洲精品久久久网站好莱| 美女在线视频一区| 国产人妻大战黑人20p| 色中色在线视频| 在线人体午夜视频| 麻豆视频传媒入口| 日本高清一二三区| 在线观看不卡的av| 亚洲欧美一区二区久久| 国产又粗又长免费视频| 成人动漫一区二区| 欧美在线播放高清精品| 成av人片一区二区| 久久久久久久久久久影视| 国内精品免费| 中文字幕无码人妻少妇免费| 内射后入在线观看一区| 国产ts人妖一区二区三区| 日韩在线国产| 免费在线观看黄色小视频| 国产精品青草久久久久福利99| 国产又爽又黄视频| 欧洲美女精品免费观看视频| 丝袜美腿亚洲色图| 国产精品qvod| 亚洲成在人线免费| 国产一伦一伦一伦| 99视频在线观看地址| 日韩欧美中文字幕在线播放| 亚洲精品午夜级久久久久| 日日摸天天爽天天爽视频| 丝袜美腿美女被狂躁在线观看| 久久精品99久久久久久| 特级特黄刘亦菲aaa级| 亚洲综合成人av| 污视频在线播放| 日韩欧美在线观看一区二区三区| 1024免费在线视频| 五丁香在线视频| 骚虎视频欧美| 亚洲成人福利视频| 1区2区在线观看| 日韩av电影网| 中文字幕在线观看第二页| 中文子幕无线码一区tr| 亚洲精品色图| 91亚洲人成网污www| 中文字幕有码av| 激情六月婷婷久久| 欧美人妻精品一区二区三区| 亚洲成av人片在www色猫咪| 欧美一区二区三区少妇| 中文字幕免费精品一区| xxxxaaa欧美另类| 情趣网站视频在线观看| 欧美成人久久久免费播放| 国产老熟妇精品观看| 在线视频一区二区三区四区| 国产成人免费视频app| 91中文字精品一区二区| 1pon在线| 青青草视频社区| 日本一级特级毛片视频| 91网在线看| 3d动漫啪啪精品一区二区免费| 久久涩涩网站| 手机在线免费看毛片| 美女亚洲一区| 国产精品老女人| av在线免费电影| 高清不卡一区二区三区| 999色成人| 99精品欧美一区二区三区小说| 久操视频在线观看免费| 亚洲欧美另类在线观看| 天天操天天操天天| 在线中文字幕资源| 久久精品xxx| 欧美一级黄色网| 少妇黄色一级片| 天天插天天干| 久久人人爽av| 国产无遮挡裸体免费视频| 变态调教一区二区三区| 高清不卡日本v二区在线| 国产亚洲第一的欧洲日产| 亚洲综合激情五月| 亚洲综合另类小说| 欧美日韩国产二区| 欧美久久久久久一卡四| 国产精品电影网| 国产成人亚洲欧洲在线| 日韩视频免费观看高清完整版在线观看| 夜夜嗨av一区二区三区网站四季av| 国产精品一级在线观看| 黑人巨大精品欧美一区二区一视频| 天天躁日日躁狠狠躁伊人| jlzzjlzz国产精品久久| 一区二区三区四区影院| 国内精品免费一区二区三区| 亚洲精品在线观看免费| 国产精品久久久久久久久久辛辛| 精品在线视频一区| 精品国产av一区二区三区| 免费中文字幕在线观看| 国产制服91一区二区三区制服| 日本在线人成| 国语自产精品视频在线看一大j8| 久久久久久久久久久久久91| 成人性a激情免费视频| 中文在线字幕观看| 午夜国产小视频| 国产精品一区二区三区免费视频| 香蕉久久夜色精品国产使用方法| 蜜桃av噜噜一区二区三| 国产凹凸在线观看一区二区| 日本一区二区三区视频| gogogogo高清视频在线| 国内精品伊人久久久| 性欧美丰满熟妇xxxx性久久久| 国产精品大全| www.啪啪.com| av五月天在线| 五月综合激情在线| 色婷婷久久久久swag精品| 成人一区二区在线| 欧美午夜免费| 色婷五月综激情亚洲综合| 久久精品国产精品亚洲毛片| 成人在线视频网站| 亚洲色无码播放| 欧美精选一区二区三区| 日韩理论电影中文字幕| 97精品国产一区二区三区| 丁香一区二区三区| 免费成人午夜视频| www.亚洲一区| 精品免费在线观看| 亚洲自拍偷拍网址| 日本中文字幕伦在线观看| 国产精品欧美久久久久天天影视| 日韩小视频在线| 精品国偷自产在线视频| 99久久久无码国产精品免费| 一级特黄录像免费播放全99| 精品卡一卡二卡三卡四在线| 国产精品久久久久久久久婷婷| 麻豆映画在线观看| 亚洲精品国产一区二区三区四区在线| 成人免费在线播放| 欧美日韩一区二区在线观看视频| 免费黄色三级网站| 欧美在线免费| 国产经典中年夫妇盗摄| 精品日产乱码久久久久久仙踪林| 青青草97国产精品免费观看| 国产亚洲精品免费| 日韩精品欧美精品| 在线影视一区二区三区| 黄漫在线播放| 欧美黄页免费| 无码少妇一区二区| 日韩最新av在线| 欧美变态视频| se在线视频| 国产亚洲精品午夜高清影院| 亚洲美女免费视频| 精品国产一区二区三区av片| 宅男噜噜噜66国产免费观看| 欧美激情 亚洲a∨综合| 精品极品在线| 黄页免费在线| 久久一区二区三| 亚洲精品综合精品自拍| 日韩在线不卡| 国产精品91久久久| 亚洲精品97久久中文字幕无码| 亚洲综合视频在线播放| 欧美激情久久久久久久久久久| 久久久久久久久久久久久久久久久| 91成人看片片| 超碰人人草人人| 成人黄色av播放免费| 亚洲欧美制服另类日韩| 99久久综合国产精品| 亚洲精品综合在线| 六十路精品视频| 午夜激情一区二区| 国产裸体视频网站| 主播大秀视频在线观看一区二区|