NSAssert:又稱為斷言,它是一個宏,通過判斷條件表達式NSAssert(),判定是否屬于BUG,從而提醒開發(fā)者代碼中出現(xiàn)的不合理情況,同時可以自定義錯誤信息.
條件表達式如下,condition為判斷條件,當其中的條件不滿足時才拋出錯誤,(也就是condition返回NO的情況),desc就是錯誤信息,可以自己定義
NSAssert(condition, desc)
在寫無限輪播的代碼中,我有一個判斷圖片輪播的時間間隔是否合理,如果時間間隔<0.01s就判定為不合理,拋出異常,代碼如下
if (timer <= 0.01) {
NSAssert(timer < 0.01, @"定時器時間間隔過短");
return NO;
}
控制臺打印如下,除了錯誤信息,還打印了錯誤的文件名和行號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: '定時器時間間隔過短'
通過源碼我們能很快定義到對應(yīng)的關(guān)鍵字__FILE__
和__LINE__
,前者是打印文件名,后者是打印對應(yīng)的行號.
接下來我們來看看它在系統(tǒng)中的定義,在代碼中有一個NSAssertionHandler
類,用來處理斷言的失敗情況,失敗情況出現(xiàn)時會傳遞一個字符串給NSAssertionHandler對象來描述失敗的原因懊缺。每個線程都有自己的NSAssertionHandler對象冒掌。當調(diào)用時,一個斷言處理器會打印包含方法和類(或函數(shù))的錯誤消息俺抽,并引發(fā)一個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模式下才會打印NSASSert的情況,在Release模式下是不會打印錯誤信息的.
NSException:
NSException *excp = [NSException exceptionWithName:@"FileError" reason:@"笨蛋,文件不存在或者不是文件夾,請好好檢查" userInfo:nil];
[excp raise];