swift 異常處理

序言

對異常的正確處理能夠明確反映在代碼執(zhí)行中出現(xiàn)的問題弦疮,使得在接下來的debug快速定位問題所在的地方诱建,提高debug 效率钮蛛,同時也能對不同情況作出不同響應昂拂。

可以使用do-catchAssertions處理異常情況受神,其中Assertions主要還是用在程序發(fā)布前的debug階段。

do-catch

在此之前要先講講guard格侯,顧名思義鼻听,就是守衛(wèi)的意思财著,用于判斷后面的條件是否成立,如果成立則往下執(zhí)行撑碴,如果不成立就執(zhí)行else里面的代碼撑教,有點類似于單個的ifguard不能像if一樣多個if-else連接使用),有點不同的是guard后面的條件參數(shù)是可以被外部引用的醉拓,就像這樣:

func checkMessage(message:[String:String]) {
    
    guard let name = message["name"] else{
        NSLog("no name")
        return
    }
    
    guard let ID = message["ID"] else{
        NSLog("no ID")
        return
    }
    
    NSLog("the name:\(name),the ID:\(ID)")
}

Swift在2.0中才引入了try伟姐、catchdo亿卤、throw愤兵、throws、這五個關鍵字組成的異常處理機制怠噪,還有用到上面的guard,下面用三明治的制作和品嘗過程為例來看看這幾個關鍵字的使用恐似。

假如這個三明治要有雞蛋,蔬菜傍念,香腸三種材料(假定面包片已經有了矫夷,哈哈),在制作過程中有可能出現(xiàn)三種材料不足的情況憋槐,用三種錯誤表示

enum MyError:ErrorType {
    case NoEgg
    case NoVegetable
    case NoSausage
}

制作過程中如果發(fā)現(xiàn)材料不足就拋出異常双藕,

func makeASandwich(egg: Bool, vegetable: Bool, sausage: Bool) throws {
    
    guard egg else{
        throw MyError.NoEgg
    }
    
    guard vegetable else{
        throw MyError.NoVegetable
    }
    
    guard sausage else{
        throw MyError.NoSausage
    }
}

接下來就可以真正開始制作了,在制作過程中拋出的異常要做一些特殊的處理阳仔,比如沒有雞蛋了忧陪,你就跟他說,哥們兒近范,你等等我這就給你買去...

 func startMakingSandwich(egg: Bool, vegetable: Bool, sausage: Bool) {
    
    do{
        try makeASandwich(egg, vegetable: vegetable, sausage: sausage)
        NSLog("eating sandwich")
    }catch MyError.NoEgg {
        NSLog("no egg")
    }catch MyError.NoVegetable {
        NSLog("no vegetable")
    }catch MyError.NoSausage {
        NSLog("no sausage")
    }catch {
        NSLog("ghostly presentce")
    }
}

調用開始制作方法嘶摊,

startMakingSandwich(true, vegetable: true, sausage: false)

打印輸出信息:

2016-04-17 11:27:52.892 SwiftTest[57244:3967339] no sausage

Assertions

Assertions 用在deug階段,在某些值出現(xiàn)的不符合要求的情況下強制讓程序終止在這個位置评矩。

NOTE
Assertions cause your app to terminate and are not a substitute for designing your code in such a way that invalid conditions are unlikely to arise. Nonetheless, in situations where invalid conditions are possible, an assertion is an effective way to ensure that such conditions are highlighted and noticed during development, before your app is published.

它并不能避免某些特殊情況的發(fā)生叶堆,而只是在特殊情況發(fā)生時以高亮的形式表示,以引起開發(fā)者注意斥杜。

語法為:

 assert(_:_:file:line:)

用法

func assertTest(someValue:Bool){
    assert(someValue, "some strange error happen")
}

someValue為真時會繼續(xù)執(zhí)行下面的代碼虱颗,如果為假,則會拋出異常蔗喂,會讓程序終止在此處,同時打印出信息忘渔,其中文件路徑和異常代碼所在的行數(shù)編譯器會自動打出:

assertion failed: some strange error happen: file /Users/hah/Documents/Demo/testProject/SwiftTest/SwiftTest/ViewController.swift, line 187

NSExcetption

拋出異常機制
SnapKit中對于未添加到super view上就添加約束而導致的異常處理:

NSException(name: "Cannot Install Constraint", reason: "No common superview between views (@\(self.makerFile)#\(self.makerLine))", userInfo: nil).raise()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缰儿,隨后出現(xiàn)的幾起案子畦粮,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锈玉,死亡現(xiàn)場離奇詭異爪飘,居然都是意外死亡,警方通過查閱死者的電腦和手機拉背,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門师崎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人椅棺,你說我怎么就攤上這事犁罩。” “怎么了两疚?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵床估,是天一觀的道長。 經常有香客問我诱渤,道長丐巫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任勺美,我火速辦了婚禮递胧,結果婚禮上,老公的妹妹穿的比我還像新娘赡茸。我一直安慰自己缎脾,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布占卧。 她就那樣靜靜地躺著遗菠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪华蜒。 梳的紋絲不亂的頭發(fā)上辙纬,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音叭喜,去河邊找鬼牲平。 笑死,一個胖子當著我的面吹牛域滥,可吹牛的內容都是我干的。 我是一名探鬼主播蜈抓,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼启绰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沟使?” 一聲冷哼從身側響起委可,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后着倾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拾酝,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年卡者,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒿囤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡崇决,死狀恐怖材诽,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情恒傻,我是刑警寧澤脸侥,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站盈厘,受9級特大地震影響睁枕,放射性物質發(fā)生泄漏。R本人自食惡果不足惜沸手,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一外遇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罐氨,春花似錦臀规、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至租悄,卻和暖如春谨究,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泣棋。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工胶哲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人潭辈。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓鸯屿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親把敢。 傳聞我的和親對象是個殘疾皇子寄摆,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • 一.異常的介紹只要我們在編程,就一定要面對錯誤處理的問題修赞。Swift在設計的時候就盡可能讓我們明確感知錯誤婶恼,明確處...
    透支未來閱讀 769評論 0 0
  • swift像其他編程語言一樣可以拋出異常并處理異常,本文就詳細說一下在swift中拋出并處理異常,swift中的一...
    初光夫閱讀 983評論 0 51
  • 觀察者模式(Observer)勾邦,定義了一種一對多的依賴關系蚣录,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在...
    紅獅子座閱讀 396評論 0 3
  • 一直覺得自己身體里住著個爺們兒眷篇,而身體無數(shù)次用實際行動證明萎河,他沒有。 我發(fā)現(xiàn)自己真的和想象中的自己有很大出入铅歼,具體...
    于厲害閱讀 397評論 2 1
  • 愛,對于未婚的少男少女而言慨飘,就是浪漫且甜蜜的愛情确憨,讓人無法抗拒。但對于一個結婚十年瓤的,每天圍著丈夫和孩子轉的家庭主婦...
    廉_bdd2閱讀 253評論 0 0