Swift學習筆記-錯誤處理

錯誤分為可恢復的錯誤和不可恢復的錯誤梅肤,可恢復的錯誤指的是能預見并處理的錯誤聂示,例如文件不存在它掂,網(wǎng)絡連接失敗等彬檀;不可恢復的錯誤指的是一類特殊的bug帆啃,例如強制展開值為nil的可空實例,數(shù)組越界訪問等窍帝;如果發(fā)生錯誤沒有處理努潘,程序就會停止運行。遺憾的是Swift中似乎只能處理可恢復的錯誤。

斷言

Swift中使用assert添加斷言慈俯,第一個參數(shù)表示要檢查的條件渤刃,為true時什么也不做,為false時停止運行并顯示錯誤信息贴膘;第二個參數(shù)為檢查條件為false時輸出的字符串信息卖子,默認為空;最后兩個參數(shù)為調用assert所在的源文件名刑峡,行號洋闽。

/// - Parameters:
///   - condition: The condition to test. `condition` is only evaluated in
///     playgrounds and `-Onone` builds.
///   - message: A string to print if `condition` is evaluated to `false`. The
///     default is an empty string.
///   - file: The file name to print with `message` if the assertion fails. The
///     default is the file where `assert(_:_:file:line:)` is called.
///   - line: The line number to print along with `message` if the assertion
///     fails. The default is the line number where `assert(_:_:file:line:)`
///     is called.
public func assert(_ condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line)

assert只有在調試模式才有效,要想在發(fā)布模式也生效可以使用precondition突梦,兩者用法相同

var number1=1
assert(number1 != 1,"number1 is 1")
precondition(number1 != 1,"number1 is 1")

拋出錯誤

遇到錯誤時诫舅,可以使用throw拋出一個符合Error協(xié)議的類型的實例,由于Error協(xié)議是一個空協(xié)議宫患,所以不需要任何屬性或方法刊懈,就能實現(xiàn)Error協(xié)議。如果該錯誤沒有被處理娃闲,則會停止運行虚汛,例如下面的代碼。

import Foundation

struct XYError:Error{
}

throw XYError()

捕捉錯誤

Swift中使用do...catch捕捉拋出的錯誤皇帮,如果沒有指定錯誤類型則會捕捉所有錯誤

import Foundation

struct XYError:Error{
}

do{
    throw XYError()
}catch{
    print("error")
}

也可以捕捉多個錯誤

import Foundation

enum NetError:Error{
    case serverError
}

struct XYError:Error{
    var errorType:Int
}

do{
    throw XYError(errorType:3)
    throw NetError.serverError
}catch NetError.serverError{
    print("net error")
}catch let e as NetError{
    print("net error \(e)")
}catch let e as XYError{
    print(e.errorType)
}catch{
    print("error")
}

可拋出錯誤的函數(shù)

在函數(shù)簽名后面加上throws表示該函數(shù)可能會拋出錯誤卷哩,調用此函數(shù)時前面必須加上try,并且需要把調用此函數(shù)寫在do...catch內属拾。

func makeError(arg:Int) throws->Int{
    guard arg > 10 else {
        throw XYError(errorType:3)
    }
    return arg
}

//編譯會報錯
func testFunc(){
    try makeError(arg: 1)
}

//正確寫法
func testFunc(){
    do{
      try makeError(arg: 1)
    }catch{
      print("error")
    }
    
}

如果調用可拋出錯誤的函數(shù)的函數(shù)也標記為throws将谊,那么該函數(shù)可以不處理錯誤,錯誤將再次拋出

func makeError(arg:Int) throws->Int{
    guard arg > 10 else {
        throw XYError(errorType:3)
    }
    return arg
}


func testFunc() throws{
    try makeError(arg: 1)
}

調用可拋出錯誤的函數(shù)的函數(shù)也可以使用try!告訴編譯器不想處理潛在錯誤渐白,出現(xiàn)錯誤時停止運行

func makeError(arg:Int) throws->Int{
    guard arg > 10 else {
        throw XYError(errorType:3)
    }
    return arg
}


func testFunc() {
    try! makeError(arg: 1)
}

try還有另外一種變體try?尊浓,可以在發(fā)生錯誤時忽略錯誤,但不會停止運行而是返回原本返回值的可空類型

func makeError(arg:Int) throws->Int{
    guard arg > 10 else {
        throw XYError(errorType:3)
    }
    return arg
}


func testFunc() {
    print(try? makeError(arg: 1))
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末礼预,一起剝皮案震驚了整個濱河市眠砾,隨后出現(xiàn)的幾起案子虏劲,更是在濱河造成了極大的恐慌托酸,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柒巫,死亡現(xiàn)場離奇詭異励堡,居然都是意外死亡,警方通過查閱死者的電腦和手機堡掏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門应结,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事鹅龄】剑” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵扮休,是天一觀的道長迎卤。 經(jīng)常有香客問我,道長玷坠,這世上最難降的妖魔是什么蜗搔? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮八堡,結果婚禮上樟凄,老公的妹妹穿的比我還像新娘。我一直安慰自己兄渺,他們只是感情好缝龄,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挂谍,像睡著了一般二拐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凳兵,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天百新,我揣著相機與錄音,去河邊找鬼庐扫。 笑死饭望,一個胖子當著我的面吹牛,可吹牛的內容都是我干的形庭。 我是一名探鬼主播铅辞,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼萨醒!你這毒婦竟也來了斟珊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤富纸,失蹤者是張志新(化名)和其女友劉穎囤踩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晓褪,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡堵漱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涣仿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勤庐。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡示惊,死狀恐怖,靈堂內的尸體忽然破棺而出愉镰,到底是詐尸還是另有隱情米罚,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布丈探,位于F島的核電站阔拳,受9級特大地震影響,放射性物質發(fā)生泄漏类嗤。R本人自食惡果不足惜糊肠,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遗锣。 院中可真熱鬧货裹,春花似錦、人聲如沸精偿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笔咽。三九已至搔预,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叶组,已是汗流浹背拯田。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甩十,地道東北人船庇。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像侣监,于是被迫代替她去往敵國和親鸭轮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)橄霉,也就是一...
    悟名先生閱讀 4,153評論 0 13
  • ??由于 JavaScript 本身是動態(tài)語言姓蜂,而且多年來一直沒有固定的開發(fā)工具按厘,因此人們普遍認為它是一種最難于調...
    霜天曉閱讀 763評論 0 1
  • 摘要:花了差不多一個月的時間,寫完了第8章異常處理覆糟,這章講述了try-catch-finally的Java異常處理...
    默然說話_牟勇閱讀 1,002評論 0 0
  • 天 并不空 醉行千年 扶著風 醒于落日前的 一朵蓮 以花香 夢入渴望月光的 我 打開一層層 綿密的呼吸 重新感覺 ...
    凌谷閱讀 249評論 0 0
  • 2018.01.25 星期四 多云轉小雪 孩子們緊張快樂的一年級上學期馬上結束了刻剥,期末考試成績也出來了,不管...
    團團圓圓媽媽閱讀 261評論 0 2