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

來源:互聯網
上載者:User

標籤:資訊   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-其實它很強大

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.