窺測Swift編程中的毛病處置與異常拋出。本站提示廣大學習愛好者:(窺測Swift編程中的毛病處置與異常拋出)文章只能為提供參考,不一定能成為您想要的結果。以下是窺測Swift編程中的毛病處置與異常拋出正文
在Swift 2.0版本中,Swift說話對其毛病處置停止了新的設計,固然了,從新設計後的成果使得該毛病處置體系用起來更爽。明天的主題就是體系的弄一下Swift中的毛病處置,和看一下Swift中是若何拋出異常的。在編譯型說話中,毛病普通分為編譯毛病和運轉時毛病。我們日常平凡在代碼中處置的毛病為運轉時毛病,我們對異常停止處置的操作的目標是為了避免法式湧現毛病而招致其他的反作用,好比用戶數據未保留等等。
在明天的文章中,先給出自動發生異常的幾種情形,然後再給出若何處置主動異常。
1、自動加入法式的幾種情形
在Objective-C中,在單位測試時我們會應用斷言,斷言中前提知足時會發生異常,並打印出響應的斷言毛病,在Swift中也有幾種發生異常的語法。在本篇博客的第一部門就給出這幾種辦法。
1.Fatal Errors(致命的毛病)
應用fatalError()函數可以立刻終止你的運用法式,在fatalError()中可以給出終止信息。應用fatalError()函數,會毫無前提的終止你的運用法式,用起來也是比擬簡略的,就是一個函數的挪用。下方這個Demo了如指掌呢,在此就不做過量贅述了。
2. Assertions(斷言)
在單位測試中是少不了斷言的,Swift中的斷言和Objective-C的差別不是太年夜,應用辦法也是年夜同小異。下方就是斷言的兩種辦法,由代碼提醒可知,在斷言中的提醒前提是可選的。斷言會在Debug形式下起感化,然則在Release版本中就會被疏忽。
在assert()函數中, 第一個參數是Bool類型,第二個參數是輸入的信息。當前提為true時,斷言不履行,響應的斷言信息不打印。當前提為false時,斷言履行,而且打印響應的斷言信息。
assertionFailure()函數只要一個Message參數,而且該參數也是可以省略的,assertionFailure()沒有前提。以下所示:
3. 先決前提(Preconditions)
Preconditions的用法和斷言一樣,不外有一點須要重要,Preconditions在debug和release形式下都邑被履行,除非應用–Ounchecked停止編譯。下方截圖是代碼提醒給出的Preconditions函數的提醒,以下所示:
關於Preconditions的詳細用法請參照斷言,和斷言用法一樣,在此就不做過量的贅述了。
二.Swift中的毛病處置
在Objective-C中,假如你處置錯誤誤的話,那末你將會對NSError很熟習。在Swift中,假如你要界說你本身的毛病類型,你只須要完成ErrorType協定便可。聲明完毛病類型後,便可以在處置毛病拋出異常時應用自界說的毛病類型了。下方將會一步步帶你走完Swift中的毛病處置的旅程。
1.應用列舉創立毛病類型
(1).遵守ErrorType協定,自界說毛病類型。下方界說了一個毛病類型列舉,該列舉遵守了ErrorType協定,在接上去的代碼中我們將會應用這個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後邊可以列舉婚配毛病類型,詳細以下所示:
(4)在列舉完成毛病類型中我們可以經由過程值綁定的情勢為毛病添加毛病代碼和毛病緣由。在聲明列舉時,我們應用了列舉元素值綁定的特征(關於列舉應用的更多細節請參考之前的博客《窺測Swift之別樣的列舉類型》)。在聲明列舉成員ErrorState時,我們為其綁定了兩個變量,一個是毛病代碼errorCode, 另外一個是毛病緣由errorReason。這二者可以在拋失足誤時為其傳入響應的值,以下方代碼片斷中的throwError函數所示,在拋失足誤是為errorCode指定的毛病代碼為404,為errorReason指定的毛病緣由是“not found”。
最初就是應用do-catch處置異常了,在catch中對綁定的毛病代碼和毛病緣由停止了獲得,而且經由過程where子句停止了毛病代碼的挑選。此處catch的用法與switch-case中獲得列舉綁定值的用法是一樣的,所以在此就不做過量的贅述。詳細完成方法以下代碼所示:
2.應用構造體為毛病處置添加Reason
在下面的內容中,應用列舉遵守ErrorType協定的方法界說了特定的毛病類型。接上去我們將應用構造體來遵守ErrorType協定,為毛病類型添加毛病緣由。也就是說,我們可以在拋失足誤時,給自界說毛病類型供給毛病緣由。該功效在開辟中長短經常用的,並且用起來也長短常爽的。接上去就看一下若何為我們的毛病類型添加毛病緣由。
(1)應用構造體創立毛病類型,下方名為MyErrorType的構造體遵守了ErrorType協定,而且在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中,詳細操作和打印成果以下所示:
由下面的輸入成果可知,error是我們自界說的MyErrorType類型,我們可使用上面的代碼來取代catch中的print語句,以下所示:
下面的做法仿佛有些費事,還有一種簡化輸入的辦法,就是在上述構造體中完成CustomDebugStringConvertible協定,對描寫信息停止一個重寫,便可以在打印error時,只打印毛病信息,下方是重寫後的構造體。
struct MyErrorType: ErrorType,CustomDebugStringConvertible { let reason : String var debugDescription: String { return "毛病類型-----\(self.dynamicType): \(reason)" } }
修正後,輸入成果以下,直接打印error輸入的就是毛病信息,而不是MyErrorType類型。
3.使String類型遵守ErrorType協定,直接應用String供給毛病緣由
在“2”中,我們應用了卻構體遵守ErrorType協定的情勢,來為毛病供給毛病信息的。在接上去的部門,我們將經由過程更加簡略的方法為拋出的毛病供給毛病信息。這類方法更加簡略,也易於懂得,詳細方法以下方代碼所示:
3、在毛病處置中應用內置症結字
1.初探這些內置症結字
在Swift中供給了一些內置症結字(__FILE__, __FUNCTION__, __LINE__等)來獲得高低文信息,在本篇博客的第三部門,將會給出若何在我們的毛病處置中應用這些內置症結字。下方就是這些內置症結字的感化,以下所示:
下面說是內置症結字,其實就是存儲代碼高低文的宏界說,上方代碼段簡略的給出了這些內置症結字的感化與用法,在接上去將在ErrorType中應用這些內置症結字,讓我們的毛病信息加倍豐碩多彩。
2.在ErrorType中應用上述內置症結字
假如想在ErrorType中應用這些高低文內置症結字,我們只須要對ErrorType停止擴大,使其在ErrorType供給毛病信息時給出失足的高低文信息。固然,這完成起來比擬簡略,就是在ErrorType中添加了一個擴大辦法contextString()。該辦法的感化就是供給毛病的高低文信息,也就是在失足的處所,挪用contextString()辦法生成高低文描寫信息便可。對ErrorType協定的詳細延展完成以下代碼段所示.
鄙人方代碼片斷中,我們對ErrorType停止了擴大,為ErrorType添加了contextString的函數完成。contextString()函數有三個默許參數,分離是file--以後文件名,function--以後失足的函數名,line--以後拋出異常的行數。上述三個參數都有參數默許值,分離對應著__FILE__, __FUNCTION__, __LINE__。該擴大函數的前往值為這三個參數構成從字符串信息。詳細完成以下所示:
3.應用擴大的contextString辦法
下面我們應用構造體完成ErrorType協定的情勢,為毛病類型添加毛病緣由。接上去我們將在添加reason的同時,應用contextString()函數添加描寫信息。下方CustomErrorType構造體遵守了ErrorType協定,個中添加了一個reason常量來存儲毛病緣由,一個context常量來存儲高低文信息,而且為該構造體添加了一個結構函數,在結構函數中初始化和reason常量。詳細完成以下所示:
4. 拋出並捕捉異常
鄙人方代碼中函數throwError()拋出了異常,該拋出的毛病類型是CustomErrorType。在創立CustomErrorType類型實例,也就是err變量時,我們指定了毛病緣由,也就是為reason賦了一個值。在創立完err實例後,我們又挪用延展contextString()函數獲得異常的高低文信息,並把前往的內容存儲在err實例的context屬性中。最初應用throw症結字拋出err實例,以下方第一部門代碼所示。
在創立拋出異常的函數後,我們須要對拋出的異常停止捕捉。也就是應用try對異常停止捕捉,應用do-catch對異常停止處置,詳細操作以下方第二段代碼所示。
5. 剖析打印成果
經由上述步調假如你在Playground中停止實驗的,那末在掌握台上你將會看到以下信息。從打印出的信息我們可以看到,信息包含reason:毛病緣由,和context:異常高低文。鄙人方的輸入成果中,文件名我們可以看到是<EXPR>這其實不是確實的文件名,由於我們是在Playground中應用的,而且不是確實的Swift源文件,所以獲得不到確實的文件名。
為了不雅察確實的文件名,我們須要在確實的Swift源文件中拋出上述異常。在特定Swift源文件中,我們會看到下方的輸入成果。從下方的輸入日記中,我們可以清晰的看到文件名是一個具體的文件途徑。以下所示:
關於本文給年夜家引見的Swift編程中的毛病處置與異常拋出就給年夜家引見到這裡,今後再做小demo時,若何用到其他的毛病處置方法,在給年夜家詳解引見。感謝年夜家對網站的支撐!