iOS-NSAssert/NSException的使用

NSAssert:又稱為斷言,它是一個(gè)宏,通過判斷條件表達(dá)式NSAssert(),判定是否屬于BUG,從而提醒開發(fā)者代碼中出現(xiàn)的不合理情況,同時(shí)可以自定義錯(cuò)誤信息.
條件表達(dá)式如下,condition為判斷條件,當(dāng)其中的條件不滿足時(shí)才拋出錯(cuò)誤,(也就是condition返回NO的情況),desc就是錯(cuò)誤信息,可以自己定義

NSAssert(condition, desc)

在寫無限輪播的代碼中,我有一個(gè)判斷圖片輪播的時(shí)間間隔是否合理,如果時(shí)間間隔<0.01s就判定為不合理,拋出異常,代碼如下

if (timer <= 0.01) {
        NSAssert(timer < 0.01, @"定時(shí)器時(shí)間間隔過短");
        return NO;
    }

控制臺(tái)打印如下,除了錯(cuò)誤信息,還打印了錯(cuò)誤的文件名和行號(hào)YPCycleView.m:164

/Users/peiyang/Desktop/PictureScroll/12-17-無限輪播/12-17-無限輪播/YPCycleView.m:164
2016-12-18 11:56:21.429 12-17-無限輪播[19020:653771] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '定時(shí)器時(shí)間間隔過短'

通過源碼我們能很快定義到對(duì)應(yīng)的關(guān)鍵字__FILE____LINE__,前者是打印文件名,后者是打印對(duì)應(yīng)的行號(hào).
接下來我們來看看它在系統(tǒng)中的定義,在代碼中有一個(gè)NSAssertionHandler類,用來處理斷言的失敗情況,失敗情況出現(xiàn)時(shí)會(huì)傳遞一個(gè)字符串給NSAssertionHandler對(duì)象來描述失敗的原因。每個(gè)線程都有自己的NSAssertionHandler對(duì)象。當(dāng)調(diào)用時(shí),一個(gè)斷言處理器會(huì)打印包含方法和類(或函數(shù))的錯(cuò)誤消息,并引發(fā)一個(gè)NSInternalInconsistencyException異常。

#if !defined(_NSAssertBody)
#define NSAssert(condition, desc, ...)  \
    do {                \
    __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS \
    if (!(condition)) {     \
            NSString *__assert_file__ = [NSString stringWithUTF8String:__FILE__]; \
            __assert_file__ = __assert_file__ ? __assert_file__ : @"<Unknown File>"; \
        [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd \
        object:self file:__assert_file__ \
            lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \
    }               \
        __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS \
    } while(0)
#endif

在DEBUG模式下才會(huì)打印NSASSert的情況,在Release模式下是不會(huì)打印錯(cuò)誤信息的.

NSException:

 NSException *excp = [NSException exceptionWithName:@"FileError" reason:@"笨蛋,文件不存在或者不是文件夾,請(qǐng)好好檢查" userInfo:nil];
        [excp raise];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • 一直想寫一篇你關(guān)于斷言的文章, 今天有時(shí)間趕緊寫出來.參考 Mattt 文章 一、Objective - C 中的...
    Mitchell閱讀 11,183評(píng)論 1 24
  • 1. SAML斷言 斷言是一個(gè)包含零個(gè)或更多個(gè)由SAML權(quán)威做出的聲明的信息包。 SAML斷言通常與由 元素表示的...
    WebSSO閱讀 1,528評(píng)論 0 1
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,200評(píng)論 2 33
  • 就目前的的理解來看,spu和sku沒有實(shí)質(zhì)界限。完全根據(jù)產(chǎn)品的細(xì)膩度來劃分。有這么個(gè)概念還是有助于設(shè)計(jì)數(shù)據(jù)庫吧。
    離子來了閱讀 729評(píng)論 0 2

友情鏈接更多精彩內(nèi)容