NSException異常

NSException是什么?

最熟悉的陌生人,這是我對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年 taoyali. 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 { 
//其實就是調用addObject
[self avoidCrashAddObject:anObject];
 } @catch (NSException *exception) { 
//能來到這里,說明可變數組添加元素的代碼有問題
 //你可以在這里進行相應的操作處理
 NSLog(@"異常名稱:%@ 異常原因:%@",exception.name, exception.reason); } @finally { 
//在這里的代碼一定會執行,你也可以進行相應的操作 
}
}
@end
  • 驗證上面的代碼的確可以捕獲異常,并且不會崩潰
NSString *nilStr = nil; NSMutableArray *arrayM = [NSMutableArray array]; [arrayM addObject:nilStr];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • NSException是什么? 最熟悉的陌生人,這是我對NSException的概述,為什么這么說呢?其實很多開發...
    粑粑又被注冊了嘛閱讀 278評論 0 0
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,757評論 0 9
  • 人類從公元前5000年生存至今,經歷了許多的時代變化、政權更替,但每一次的變革都具有時代的意義,對人類的發展都有重...
    小穎885閱讀 384評論 0 0
  • 在生活中,很多人都會被頸部疼痛困擾。 【頸部問題的普遍性】 比如昨天,小編在朋友圈看到有人求助:治療頸椎病,誰有良...
    WELL運動康復閱讀 1,020評論 0 1
  • 上節科學課羅老師給我們留了一個作業-樹葉貼畫。我們班有48位同學,只有兩個同學記住了要做樹葉貼畫,而其他46個...
    M張皓軒M閱讀 406評論 0 0