iOS 異常處理 及 try/try!/try?區(qū)別 及理解

在開(kāi)發(fā)過(guò)程中,我們可能會(huì)在某些情況下自定義拋出異常羡亩,讓用戶或者開(kāi)發(fā)者捕捉到提示摩疑,便于我們的開(kāi)發(fā)及維護(hù)
如何自定義異常呢?
首先我們需要自定義一個(gè)ErrorInfo機(jī)構(gòu)體畏铆,繼承于Error雷袋,并在結(jié)構(gòu)體中加入我們想拋出的異常信息

/// ErrorInfo
public struct ErrorInfo: Error {
    /// agentStatus
    public var agentStatus:String = ""
    /// errorCode
    public var errorCode: String = ""
    /// statusCode
    public var statusCode : String = ""    /// errorMessage
    public var errorMessage : String = ""
    /// localizedDescription
    public var localizedDescription: String {
        return "The error code is: \(errorCode),status is \(statusCode),\(errorMessage)"
    }
}

然后我們可以進(jìn)行實(shí)例化異常對(duì)象,將自定義的異常信息拋出

public static let error101001:ErrorInfo = ErrorInfo(agentStatus:"101",errorCode:"error101001",statusCode: "DEFAULT",errorMessage: "拋出異常101001")
public static let error102002:ErrorInfo = ErrorInfo(agentStatus:"102",errorCode:"error102002",statusCode: "DEFAULT",errorMessage: "拋出異常102002")
異常的拋出:

swift的異常是可以傳遞的辞居,在不需要進(jìn)行異常處理的方法中楷怒,我們只需將異常進(jìn)行拋出即可蛋勺,直至處理異常的方法,在拋出異常的方法聲明時(shí)鸠删,我們需加入throws關(guān)鍵詞

// 在firstFunc方法中拋出異常抱完,方法聲明中加入throws,ErrorType為我們定義的一個(gè)類冶共,來(lái)管理所有的error
func firstFunc(a:Int) throws -> () {
    if a = 1 {
        throw ErrorType.error101001
    }
}
// secondFunc我們將異常繼續(xù)拋出不進(jìn)行處理乾蛤,方法聲明中加入throws,在firstFunc前加入try
func secondFunc(b:Int) throws -> String? () {
    c = b + 1
    try firstFunc(c)
    return "\(c)"
}
// 方法thirdFunc中捅僵,我們進(jìn)行異常的處理家卖,這時(shí)方法聲明中不需要加throws了,在有異常拋出的方法外庙楚,需進(jìn)行do-catch上荡,在catch中,可以捕捉到ErrorInfo馒闷,并進(jìn)行處理
func thirdFunc(c:Int) -> () {
    do {
        try secondFunc(c)
    } catch {
        print(error)
        let errorInfo = error as! ErrorInfo
        let errorMsg:String = "agentStatus = \(errorInfo.agentStatus)\n" + "errorCode = \(errorInfo.errorCode)\n"  + "status = \(errorInfo.statusCode)\n" + "message = " + errorInfo.errorMessage
        print(errorMsg)
    }
}

理解:

可以這么理解酪捡。
異常就是一個(gè)炸彈,在某種情況下纳账,first會(huì)生產(chǎn)出炸彈逛薇,但是他不處理,通過(guò)聲明方法的時(shí)候的throws關(guān)鍵字疏虫,來(lái)對(duì)外表達(dá)永罚,我這里會(huì)生成炸彈哦,然后second因?yàn)橐猜暶髁藅hrows卧秘,所以他可以繼續(xù)不處理(當(dāng)然也可以處理)呢袱,使用try調(diào)用first,如果first拋出了炸彈翅敌,他就可以繼續(xù)拋下去羞福,而third沒(méi)有聲明throws,所以蚯涮,在third方法中治专,就必須用do-catch把炸彈解決掉了
throws:關(guān)鍵詞的作用,就是告訴外面遭顶,我這里可能會(huì)拋出異常看靠,沒(méi)有throws,就必須把方法內(nèi)的異常用do-catch處理掉
try:相當(dāng)于一個(gè)異常處理工具(不同作用見(jiàn)下面“try/try!/try?區(qū)別”)液肌,可以傳遞或者簡(jiǎn)單處理掉異常
do-catch:相當(dāng)于一個(gè)安全拆彈器,如果方法中拋出異常鸥滨,我們就在catch中將異常安全的處理掉嗦哆。

try/try!/try?區(qū)別

try  : 拋出異常并可傳遞或處理
(轉(zhuǎn)鍋神器谤祖,和throws配合使用效果極佳)
try? : 異常不傳遞,一般用在有返回值時(shí)的處理老速,方法成功則返回成功后的值粥喜,失敗則返回nil,類似于解包時(shí)??給默認(rèn)值
(簡(jiǎn)易拆彈器橘券,比較適合有返回值的方法额湘,沒(méi)異常返回正確值,有異常我把炸彈處理了旁舰,給你個(gè)nil)
try! : 異常不傳遞锋华,失敗則閃退,類似強(qiáng)制解包遇到nil的閃退
(自曝型拆彈器箭窜,沒(méi)問(wèn)題你好我好大家好毯焕,有問(wèn)題,app直接閃退磺樱,大家一起死)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纳猫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子竹捉,更是在濱河造成了極大的恐慌芜辕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件块差,死亡現(xiàn)場(chǎng)離奇詭異侵续,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)憾儒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)询兴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人起趾,你說(shuō)我怎么就攤上這事诗舰。” “怎么了训裆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵眶根,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我边琉,道長(zhǎng)属百,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任变姨,我火速辦了婚禮族扰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己渔呵,他們只是感情好怒竿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著扩氢,像睡著了一般耕驰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上录豺,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天朦肘,我揣著相機(jī)與錄音,去河邊找鬼双饥。 笑死媒抠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的兢哭。 我是一名探鬼主播领舰,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼迟螺!你這毒婦竟也來(lái)了冲秽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤矩父,失蹤者是張志新(化名)和其女友劉穎锉桑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體窍株,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡民轴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了球订。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片后裸。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冒滩,靈堂內(nèi)的尸體忽然破棺而出微驶,到底是詐尸還是另有隱情,我是刑警寧澤开睡,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布因苹,位于F島的核電站,受9級(jí)特大地震影響篇恒,放射性物質(zhì)發(fā)生泄漏扶檐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一胁艰、第九天 我趴在偏房一處隱蔽的房頂上張望款筑。 院中可真熱鬧智蝠,春花似錦、人聲如沸奈梳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颈嚼。三九已至,卻和暖如春饭寺,著一層夾襖步出監(jiān)牢的瞬間阻课,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工艰匙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留限煞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓员凝,卻偏偏與公主長(zhǎng)得像署驻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子健霹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • 引言 在程序運(yùn)行過(guò)程中(注意是運(yùn)行階段旺上,程序可以通過(guò)編譯),如果JVM檢測(cè)出一個(gè)不可能執(zhí)行的操作糖埋,就會(huì)出現(xiàn)運(yùn)行時(shí)錯(cuò)...
    Steven1997閱讀 2,431評(píng)論 1 6
  • 快到家了宣吱,雷陽(yáng)的心情很復(fù)雜。有期待瞳别,畢竟將近六年沒(méi)見(jiàn)征候,他不知道父母變成了什么樣,是不是更老了一些祟敛?有愧疚疤坝,雖說(shuō)是為...
    竹曳的雷厲風(fēng)行閱讀 255評(píng)論 0 0
  • 冥想,這個(gè)詞來(lái)源于梵文的DHYANA馆铁,英文是meditation跑揉,是東方傳統(tǒng)上珍貴的一種技法,通過(guò)瑜伽冥想來(lái)制服心...
    豆丁9005閱讀 762評(píng)論 0 15
  • 曾經(jīng)聽(tīng)過(guò)并見(jiàn)過(guò)同事間很多不幸福的婚姻叼架,當(dāng)時(shí)默默地在心里告訴自己畔裕,在自己還不夠成熟前,一定不要太早談戀愛(ài)乖订,畢竟女人都...
    可愛(ài)的小漫漫閱讀 306評(píng)論 0 1