iOS被開發者遺忘在角落的NSException-其實它很強大

NSException是什麼?

最熟悉的陌生人,這是我對NSException的概述,爲何這麼說呢?其實不少開發者接觸到NSException的頻率很是頻繁,但不少人都不知道什麼是NSException,不知道如何使用NSException。下面從一張截圖開始講起NSException。數組

 
崩潰截圖.png  圖太大了 放最後了
 

上面這張圖想必你們都不陌生吧!(臥槽,程序又崩潰了)。ui

其實控制檯輸出的日誌信息就是NSException產生的,一旦程序拋出異常,程序就會崩潰,控制檯就會有這些崩潰日誌。spa


NSException的基本用法

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

//異常的名稱 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來使程序崩潰呢?其實主要的出發點是讓開發者認識到哪裏的代碼有問題。code

下面說兩個NSException的實用技巧吧orm

  • 一、 若本身封裝一套SDK,若要提示哪裏出錯,那麼就可使用NSException。就像上面NSException的基本用法中的代碼同樣。
  • 二、能夠用來捕獲異常,防止程序的崩潰。當你意識到某段代碼可能存在崩潰的危險,那麼你就能夠經過捕獲異常來防止程序的崩潰。代碼以下
NSString *nilStr = nil; NSMutableArray *arrayM = [NSMutableArray array]; @try { //若是@try中的代碼會致使程序崩潰,就會來到@catch //將一個nil插入到可變數組中,這行代碼確定有問題 [arrayM addObject:nilStr]; } @catch (NSException *exception) { //若是@try中的代碼有問題(致使崩潰),就會來到@catch //在這裏你能夠進行相應的處理操做 //若是你要拋出異常(讓程序崩潰),就寫上 @throw exception } @finally { //@finally中的代碼是必定會執行的 //你能夠在這裏進行一些相應的操做 } 
  • 三、最最實用的一個技術點就是利用 分類(category) + runtime + 異常的捕獲 來防止Foundation一些經常使用方法使用不當而致使的崩潰。其原理就是利用category、runtime來交換兩個方法,而且在方法中捕獲異常進行相應的處理。(這裏須要瞭解一些關於runtime的知識點,若對runtime不熟悉的朋友,能夠先去了解下runtime的方法交換)。下面直接附上大概的使用方法。

添加分類,利用runtime交換方法blog

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

控制檯輸出截圖以下get

 
捕獲到的異常信息.png

 




 

 

相關文章
相關標籤/搜索