NSException異常

NSException是什么?

最熟悉的陌生人,這是我對NSException的概述,為什么這么說呢媒殉?其實很多開發(fā)者接觸到NSException的頻率非常頻繁,但很多人都不知道什么是NSException摔敛,不知道如何使用NSException廷蓉。下面從一張截圖開始講起NSException。


程序異常截圖.png

上面這張圖想必大家都不陌生吧马昙!(臥槽桃犬,程序又崩潰了)。
其實控制臺輸出的日志信息就是NSException產(chǎn)生的行楞,一旦程序拋出異常攒暇,程序就會崩潰,控制臺就會有這些崩潰日志子房。



NSException的基本用法

下面代碼就會讓你的程序崩潰

//異常的名稱
 NSString *exceptionName = @"自定義異常"; 
//異常的原因 
NSString *exceptionReason = @"我長得太帥了形用,所以程序崩潰了";
 //異常的信息
 NSDictionary *exceptionUserInfo = nil; 
NSException *exception = [NSException exceptionWithName:exceptionName reason:exceptionReason userInfo:exceptionUserInfo]; 
NSString *aboutMe = @"太帥了"; 
if ([aboutMe isEqualToString:@"太帥了"])
 { 
//拋異常 @throw exception;
 }

崩潰截圖如下:


自定義崩潰截圖.png

為什么說NSException很強(qiáng)大

NSException掌控著程序的生命,程序的崩潰就是NSException來控制的池颈,你說NSException不強(qiáng)大嗎尾序?那為何要NSException來使程序崩潰呢?其實主要的出發(fā)點是讓開發(fā)者認(rèn)識到哪里的代碼有問題躯砰。

  • 下面說兩個NSException的實用技巧吧
    1每币、 若自己封裝一套SDK,若要提示哪里出錯琢歇,那么就可以使用NSException兰怠。就像上面NSException的基本用法中的代碼一樣梦鉴。
    2、可以用來捕獲異常揭保,防止程序的崩潰肥橙。當(dāng)你意識到某段代碼可能存在崩潰的危險,那么你就可以通過捕獲異常來防止程序的崩潰秸侣。代碼如下
NSString *nilStr = nil; 
NSMutableArray *arrayM = [NSMutableArray array];
 @try { 
//如果@try中的代碼會導(dǎo)致程序崩潰存筏,就會來到@catch 
//將一個nil插入到可變數(shù)組中,這行代碼肯定有問題
 [arrayM addObject:nilStr]; 
} @catch (NSException *exception) { 
//如果@try中的代碼有問題(導(dǎo)致崩潰),就會來到@catch 
//在這里你可以進(jìn)行相應(yīng)的處理操作 
//如果你要拋出異常(讓程序崩潰),就寫上 
@throw exception 
} @finally {
 //@finally中的代碼是一定會執(zhí)行的 
//你可以在這里進(jìn)行一些相應(yīng)的操作
 }

3味榛、最最實用的一個技術(shù)點就是利用 分類(category) + runtime + 異常的捕獲 來防止Foundation一些常用方法使用不當(dāng)而導(dǎo)致的崩潰椭坚。其原理就是利用category、runtime來交換兩個方法搏色,并且在方法中捕獲異常進(jìn)行相應(yīng)的處理善茎。(這里需要了解一些關(guān)于runtime的知識點,若對runtime不熟悉的朋友频轿,可以先去了解下runtime的方法交換)垂涯。下面直接附上大概的使用方法。

  • 添加分類航邢,利用runtime交換方法
//
// NSMutableArray+Extension.m
// categoryTest
//
// Created by mac on 16/10/6.
// Copyright ? 2016年 taoyali. All rights reserved.
//#import "NSMutableArray+Extension.h"
#import <objc/runtime.h>
@implementation NSMutableArray (Extension)
+ (void)load {
 Class arrayMClass = NSClassFromString(@"__NSArrayM"); 
//獲取系統(tǒng)的添加元素的方法
 Method addObject = class_getInstanceMethod(arrayMClass, @selector(addObject:)); 
//獲取我們自定義添加元素的方法 
Method avoidCrashAddObject = class_getInstanceMethod(arrayMClass, @selector(avoidCrashAddObject:)); 
//將兩個方法進(jìn)行交換 
//當(dāng)你調(diào)用addObject,其實就是調(diào)用avoidCrashAddObject 
//當(dāng)你調(diào)用avoidCrashAddObject耕赘,其實就是調(diào)用addObject method_exchangeImplementations(addObject, avoidCrashAddObject);
}
- (void)avoidCrashAddObject:(id)anObject { 
@try { 
//其實就是調(diào)用addObject
[self avoidCrashAddObject:anObject];
 } @catch (NSException *exception) { 
//能來到這里,說明可變數(shù)組添加元素的代碼有問題
 //你可以在這里進(jìn)行相應(yīng)的操作處理
 NSLog(@"異常名稱:%@ 異常原因:%@",exception.name, exception.reason); } @finally { 
//在這里的代碼一定會執(zhí)行,你也可以進(jìn)行相應(yīng)的操作 
}
}
@end
  • 驗證上面的代碼的確可以捕獲異常,并且不會崩潰
NSString *nilStr = nil; NSMutableArray *arrayM = [NSMutableArray array]; [arrayM addObject:nilStr];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膳殷,一起剝皮案震驚了整個濱河市鞠苟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秽之,老刑警劉巖当娱,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異考榨,居然都是意外死亡跨细,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門河质,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冀惭,“玉大人,你說我怎么就攤上這事掀鹅∩⑿荩” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵乐尊,是天一觀的道長戚丸。 經(jīng)常有香客問我,道長扔嵌,這世上最難降的妖魔是什么限府? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任夺颤,我火速辦了婚禮,結(jié)果婚禮上胁勺,老公的妹妹穿的比我還像新娘世澜。我一直安慰自己,他們只是感情好署穗,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布寥裂。 她就那樣靜靜地躺著,像睡著了一般案疲。 火紅的嫁衣襯著肌膚如雪抚恒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天络拌,我揣著相機(jī)與錄音,去河邊找鬼回溺。 笑死春贸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遗遵。 我是一名探鬼主播萍恕,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼车要!你這毒婦竟也來了允粤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翼岁,失蹤者是張志新(化名)和其女友劉穎类垫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琅坡,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡悉患,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了榆俺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片售躁。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茴晋,靈堂內(nèi)的尸體忽然破棺而出陪捷,到底是詐尸還是另有隱情,我是刑警寧澤诺擅,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布市袖,位于F島的核電站,受9級特大地震影響烁涌,放射性物質(zhì)發(fā)生泄漏凌盯。R本人自食惡果不足惜付枫,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驰怎。 院中可真熱鬧阐滩,春花似錦、人聲如沸县忌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽症杏。三九已至装获,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厉颤,已是汗流浹背穴豫。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留逼友,地道東北人精肃。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像帜乞,于是被迫代替她去往敵國和親司抱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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

  • NSException是什么? 最熟悉的陌生人黎烈,這是我對NSException的概述习柠,為什么這么說呢?其實很多開發(fā)...
    粑粑又被注冊了嘛閱讀 274評論 0 0
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉照棋,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,715評論 0 9
  • 人類從公元前5000年生存至今资溃,經(jīng)歷了許多的時代變化、政權(quán)更替烈炭,但每一次的變革都具有時代的意義肉拓,對人類的發(fā)展都有重...
    小穎885閱讀 373評論 0 0
  • 在生活中膏执,很多人都會被頸部疼痛困擾驻售。 【頸部問題的普遍性】 比如昨天,小編在朋友圈看到有人求助:治療頸椎病更米,誰有良...
    WELL運動康復(fù)閱讀 1,006評論 0 1
  • 上節(jié)科學(xué)課羅老師給我們留了一個作業(yè)-樹葉貼畫欺栗。我們班有48位同學(xué),只有兩個同學(xué)記住了要做樹葉貼畫,而其他46個...
    M張皓軒M閱讀 397評論 0 0