標籤:資訊 ati meta 提示 time ref upload show pac
轉載自 http://www.jianshu.com/p/05aad21e319eiOS被開發人員遺忘在角落的NSException-其實它很強大字數597 閱讀968 評論4 喜歡28NSException是什麼?
最熟悉的陌生人,這是我對NSException的概述,為什麼這麼說呢?其實很多開發人員接觸到NSException的頻率非常頻繁,但很多人都不知道什麼是NSException,不知道如何使用NSException。下面從一張開始講起NSException。
崩潰.png
上面這張圖想必大家都不陌生吧!(臥槽,程式又崩潰了)。
其實控制台輸出的日誌資訊就是NSException產生的,一旦程式拋出異常,程式就會崩潰,控制台就會有這些崩潰日誌。
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很強大
NSException掌控著程式的生命,程式的崩潰就是NSException來控制的,你說NSException不強大嗎?那為何要NSException來使程式崩潰呢?其實主要的出發點是讓開發人員認識到哪裡的代碼有問題。
下面說兩個NSException的實用技巧吧
- 1、 若自己封裝一套SDK,若要提示哪裡出錯,那麼就可以使用NSException。就像上面NSException的基本用法中的代碼一樣。
- 2、可以用來捕獲異常,防止程式的崩潰。當你意識到某段代碼可能存在崩潰的危險,那麼你就可以通過捕獲異常來防止程式的崩潰。代碼如下
NSString *nilStr = nil; NSMutableArray *arrayM = [NSMutableArray array]; @try { //如果@try中的代碼會導致程式崩潰,就會來到@catch //將一個nil插入到可變數組中,這行代碼肯定有問題 [arrayM addObject:nilStr]; } @catch (NSException *exception) { //如果@try中的代碼有問題(導致崩潰),就會來到@catch //在這裡你可以進行相應的處理操作 //如果你要拋出異常(讓程式崩潰),就寫上 @throw exception } @finally { //@finally中的代碼是一定會執行的 //你可以在這裡進行一些相應的操作 }
- 3、最最實用的一個技術點就是利用 分類(category) + runtime + 異常的捕獲 來防止Foundation一些常用方法使用不當而導致的崩潰。其原理就是利用category、runtime來交換兩個方法,並且在方法中捕獲異常進行相應的處理。(這裡需要瞭解一些關於runtime的知識點,若對runtime不熟悉的朋友,可以先去瞭解下runtime的方法交換)。下面直接附上大概的使用方法。
添加分類,利用runtime交換方法
//// NSMutableArray+Extension.m// categoryTest//// Created by mac on 16/10/6.// Copyright ? 2016年 chenfanfang. All rights reserved.//#import "NSMutableArray+Extension.h"#import <objc/runtime.h>@implementation NSMutableArray (Extension)+ (void)load { Class arrayMClass = NSClassFromString(@"__NSArrayM"); //擷取系統的添加元素的方法 Method addObject = class_getInstanceMethod(arrayMClass, @selector(addObject:)); //擷取我們自訂添加元素的方法 Method avoidCrashAddObject = class_getInstanceMethod(arrayMClass, @selector(avoidCrashAddObject:)); //將兩個方法進行交換 //當你調用addObject,其實就是調用avoidCrashAddObject //當你調用avoidCrashAddObject,其實就是調用addObject method_exchangeImplementations(addObject, avoidCrashAddObject);}- (void)avoidCrashAddObject:(id)anObject { @try { [self avoidCrashAddObject:anObject];//其實就是調用addObject } @catch (NSException *exception) { //能來到這裡,說明可變數組添加元素的代碼有問題 //你可以在這裡進行相應的操作處理 NSLog(@"異常名稱:%@ 異常原因:%@",exception.name, exception.reason); } @finally { //在這裡的代碼一定會執行,你也可以進行相應的操作 }}@end
驗證上面的代碼的確可以捕獲異常,並且不會崩潰
NSString *nilStr = nil; NSMutableArray *arrayM = [NSMutableArray array]; [arrayM addObject:nilStr];
控制台輸出如下
捕獲到的異常資訊.png利用category + runtime + 異常的捕獲 來寫一個防止崩潰的架構
- 利用category + runtime + 異常的捕獲 來寫一個防止崩潰的架構
(轉)iOS被開發人員遺忘在角落的NSException-其實它很強大