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];