iOS 常見Exception

在開發(fā)過程中,總是會(huì)遇到各種Exception化焕,在此總結(jié)一些常見的Exception。

NSInvalidArgumentException

錯(cuò)誤類型 NSInvalidArgumentException
log輸出 unrecognized selector sent to instance xxxx
錯(cuò)誤釋義 給實(shí)體對象發(fā)送了不認(rèn)識的消息,即對象調(diào)用方法出錯(cuò)
錯(cuò)誤基本原因 Objective-C的方法調(diào)用其實(shí)是基于消息傳遞機(jī)制,并且是動(dòng)態(tài)編譯誉结。因此在編譯階段不會(huì)進(jìn)行類和方法的綁定,而是在運(yùn)行時(shí)執(zhí)行綁定操作券躁。當(dāng)類的方法沒有實(shí)現(xiàn)或?qū)ο蟊惶崆皉elease時(shí)惩坑,這個(gè)問題會(huì)在運(yùn)行時(shí)表現(xiàn)出來,從而導(dǎo)致App崩潰

常見場景

場景1 給對象發(fā)送消息時(shí):
[self performSelector:@selector(testException:) withObject:@"string"];

-(void)testException {
    NSLog(@"%s",__func__);
}

錯(cuò)誤分析:給對象發(fā)消息的時(shí)候嘱朽,該消息是帶形參的旭贬,而實(shí)現(xiàn)的方法卻不帶形參怔接,因此產(chǎn)生了異常搪泳。

場景2 在集合中:

NSMutableArray *array = [NSMutableArray array];
[array addObject:nil];

錯(cuò)誤分析:當(dāng)企圖給集合插入nil值的時(shí)候,實(shí)際上調(diào)用的是[__NSArrayM insertObject: atIndex: ]扼脐,根據(jù)CFArray的源碼推斷岸军,在該方法里面,對插入的對象進(jìn)行了斷言操作(僅僅是猜想瓦侮,未能找到CFMutableArray的源碼)艰赞。

場景3 在代理中:
@protocol requestDelegate <NSObject>

-(void)sendRequest:(NSURL *)url;

@end

@implementation DelegateManager
-(BOOL)doRequest:(NSURL *)url {     
    ...     
    if (delegate) {  
        ...  
        return [delegate sendRequest:url];     
    }     
    ...     
    return NO;  
}  
@end

delegate作為設(shè)計(jì)模式的一種,貫穿于App中肚吏。通常我們會(huì)將delegate定義為id類型方妖,也就意味著,任何對象都有可能成為代理罚攀。成為代理的實(shí)例可能只是遵守了協(xié)議党觅,但是卻沒對協(xié)議的方法進(jìn)行具體實(shí)現(xiàn)雌澄。在上面的場景中,有可能代理對象并沒有實(shí)現(xiàn)sendRequest:方法杯瞻,此時(shí)調(diào)用sendRequest:方法就會(huì)出現(xiàn)崩潰镐牺。

正確的操作

在給delegate發(fā)送消息之前應(yīng)該進(jìn)行respondsToSelector判斷

-(BOOL)doRequest:(NSURL *)url {
    ...
    if (delegate && [delegate respondsToSelector:@selector(sendRequest:)]) {
        ...
        return [delegate sendRequest:url];
    }
    ...
    return NO;
}

NSRangeException

錯(cuò)誤類型 NSRangeException
log輸出 1.index 2 beyond bounds [0 .. 1]
2.index x beyond bounds for ..
錯(cuò)誤釋義 1.索引序號2超出0~1區(qū)間
2.索引序號超出...

常見場景

場景1 插入或獲取對象:
    NSMutableArray *array = [NSMutableArray array];
    [array addObject:@"one"];
    [array addObject:@"two"];
    [array objectAtIndex:2];

錯(cuò)誤分析:當(dāng)試圖從數(shù)組中獲得一個(gè)對象的時(shí)候,索引大于自身容量魁莉,因而引起該異常睬涧。同樣在插入的時(shí)候,不正確的索引值也會(huì)引發(fā)這個(gè)問題旗唁。

場景2 截取字符串:
NSMutableString *str = [[NSMutableString alloc] initWithString:@"one"];
[str substringFromIndex:5];

錯(cuò)誤分析:當(dāng)試圖截取字符串的時(shí)候畦浓,起始索引大于字符串本身長度。

NSGenericException

錯(cuò)誤類型 NSGenericException
log輸出 xxxxxx was mutated while being enumerated.
錯(cuò)誤釋義 對象xxxxxx在枚舉的時(shí)候是不可變的

常見場景

場景1 遍歷的時(shí)候添加或移除對象:
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil];
for (NSString *string in array) {
    [array addObject:@"4"];
//    [array removeObject:@"66"];
}

錯(cuò)誤分析:在遍歷的時(shí)候检疫,對集合進(jìn)行了插入/刪除操作宅粥。

NSFileHandleOperationException

錯(cuò)誤類型 NSFileHandleOperationException
log輸出 Bad file descriptor
錯(cuò)誤釋義 錯(cuò)誤的文件描述符

常見場景

場景1 對文件進(jìn)行操作:
    NSString *path = NSHomeDirectory();
    NSString *filePath = [path stringByAppendingPathComponent:@"1.txt"];
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
    [fileHandle seekToEndOfFile];
    NSData *data = [@"Hello World" dataUsingEncoding:NSUTF8StringEncoding];
    [fileHandle writeData:data];
    [fileHandle closeFile];

錯(cuò)誤分析:企圖對文件進(jìn)行寫操作,但獲取句柄時(shí)电谣,請求的確是只讀句柄秽梅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剿牺,隨后出現(xiàn)的幾起案子企垦,更是在濱河造成了極大的恐慌,老刑警劉巖晒来,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钞诡,死亡現(xiàn)場離奇詭異,居然都是意外死亡湃崩,警方通過查閱死者的電腦和手機(jī)荧降,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攒读,“玉大人朵诫,你說我怎么就攤上這事””猓” “怎么了剪返?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長邓梅。 經(jīng)常有香客問我脱盲,道長,這世上最難降的妖魔是什么日缨? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任钱反,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘面哥。我一直安慰自己乙各,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布幢竹。 她就那樣靜靜地躺著耳峦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焕毫。 梳的紋絲不亂的頭發(fā)上蹲坷,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機(jī)與錄音邑飒,去河邊找鬼循签。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疙咸,可吹牛的內(nèi)容都是我干的县匠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼撒轮,長吁一口氣:“原來是場噩夢啊……” “哼乞旦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起题山,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤兰粉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后顶瞳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玖姑,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年慨菱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了焰络。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡符喝,死狀恐怖闪彼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洲劣,我是刑警寧澤备蚓,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布课蔬,位于F島的核電站囱稽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏二跋。R本人自食惡果不足惜战惊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扎即。 院中可真熱鬧吞获,春花似錦况凉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烤黍,卻和暖如春知市,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背速蕊。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工嫂丙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人规哲。 一個(gè)月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓跟啤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唉锌。 傳聞我的和親對象是個(gè)殘疾皇子隅肥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

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

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,131評論 30 470
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)袄简,斷路器武福,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,930評論 6 13
  • 【原文】 2.3子曰:道之以政,齊之以刑痘番,民免而無恥捉片;道之以德,齊之以禮汞舱,有恥且格伍纫。 【譯文】 孔子說:用法制禁令...
    子張閱讀 542評論 0 0
  • 01 因?yàn)檠劳从ü妫謥淼结t(yī)院看牙,剛進(jìn)門泌神,就被一陣歇斯...
    小花喵咪咪閱讀 738評論 0 5