1. 程式人生 > >iOS崩潰 捕獲異常處理(二)

iOS崩潰 捕獲異常處理(二)

之前部落格介紹啦一種異常捕獲後彈窗提示使用者的方法,《iOS崩潰 捕獲異常處理》,下面提供另外一種異常捕獲的方法。原理一致,但實現略有不同。可供參考。

1、在didFinishLaunchingWithOptions 中,註冊訊息處理函式,處理崩潰資訊,寫入本地。

 //註冊訊息處理函式的處理方法,處理崩潰資訊,寫入本地
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

2、將CrashManager.h、 CrashManager.m 拖拽到工程中,具體實現如下:
CrashManager.h:

@interface
CrashManager : NSObject /** 捕捉Crash */ void uncaughtExceptionHandler(NSException *exception); + (id)defaultManager;//單例 /** 移除Crash的log日誌 */ - (void)clearCrashLog; /** 是否有log日誌 */ - (BOOL)isCrashLog; /** crash log日誌 */ - (NSString *)crashLogContent; @end

CrashManager.m 中核心函式如下:

void uncaughtExceptionHandler(NSException
*exception){ // 異常的堆疊資訊 NSArray *stackArray = [exception callStackSymbols]; // 出現異常的原因 NSString *reason = [exception reason]; // 異常名稱 NSString *name = [exception name]; NSString *exceptionInfo = [NSString stringWithFormat:@"Exception reason:%@\nException name:%@\nException stack:%@"
,name, reason, stackArray]; NSLog(@"%@", exceptionInfo); NSMutableArray *tmpArr = [NSMutableArray arrayWithArray:stackArray]; [tmpArr insertObject:reason atIndex:0]; NSString *crashLocalPath = [NSString stringWithFormat:@"%@/Documents/microFinanceCrashError.txt",NSHomeDirectory()]; NSLog(@"crash LocalPath :%@ ",crashLocalPath); //儲存到本地 -- 當然你可以在下次啟動的時候,上傳這個log [exceptionInfo writeToFile:crashLocalPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; }
+ (id)defaultManager{
    @synchronized(self){
        static dispatch_once_t pred;
        dispatch_once(&pred, ^{
            crashManager = [[self alloc] init];
        });
    }
    return crashManager;
}


#pragma mark -移除Crash的log日誌
- (void)clearCrashLog{
    NSFileManager *fileManager = [[NSFileManager alloc]init];
    [fileManager removeItemAtPath:LocalCrashLogPath error:nil];
}

#pragma mark - 是否有log日誌
- (BOOL)isCrashLog{
    NSError *error;
    NSString *textFileContents = [NSString stringWithContentsOfFile:LocalCrashLogPath encoding:NSUTF8StringEncoding error:&error];
    if ([self checkConvertNull:textFileContents]) {//無log日誌
        return NO;
    }else{
        return YES;
    }
}


#pragma mark -crash log日誌
- (NSString *)crashLogContent{
    NSError *error;
    NSString *textFileContents = [NSString stringWithContentsOfFile:LocalCrashLogPath encoding:NSUTF8StringEncoding error:&error];
    if ([self checkConvertNull:textFileContents]) {//無log日誌
        return @"";
    }else{
        return textFileContents;
    }
}

#pragma mark - 檢查是否有空字元
- (BOOL)checkConvertNull:(NSString *)object{
    if ([object isEqual:[NSNull null]] || [object isKindOfClass:[NSNull class]] ||object==nil || [object isEqualToString:@""]) {
        return YES;
    }else{
        return NO;
    }
}

3、在ViewController中,做如下測試案例:

- (void)viewDidLoad {
    [super viewDidLoad];
    CrashManager *crashManager = [CrashManager defaultManager];

    if ([crashManager isCrashLog]) {//Crash日誌

        NSString *crashString = [crashManager crashLogContent];//Crash日誌內容
        NSLog(@"crashString = %@",crashString);//
    }
//    [crashManager clearCrashLog];//清除Crash日誌
    //Crash測試
    UIButton *crashBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    crashBtn.frame = CGRectMake(self.view.frame.size.width/2 - 50, 200, 100, 40);
    crashBtn.backgroundColor = [UIColor redColor];
    [crashBtn addTarget:self action:@selector(crashTest) forControlEvents:UIControlEventTouchUpInside];
    [crashBtn setTitle:@"Crash" forState:UIControlStateNormal];
    [crashBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [self.view addSubview:crashBtn];

}

-(void)crashTest{

    NSString *crashString = nil;
    NSDictionary *params = [NSDictionary dictionary];
    params = @{@"crashTest":crashString,
               };
}

相關推薦

iOS崩潰 捕獲異常處理

之前部落格介紹啦一種異常捕獲後彈窗提示使用者的方法,《iOS崩潰 捕獲異常處理》,下面提供另外一種異常捕獲的方法。原理一致,但實現略有不同。可供參考。 1、在didFinishLaunchingWithOptions 中,註冊訊息處理函式,處理崩潰資訊,寫入本

JAVA學習第十九課java程序的異常處理

num 函數 錯誤 style col 編譯失敗 return [] java 異常處理的捕捉形式: 這是能夠對異常進行針對性處理的方式 六、try、catch的理解 詳細格式: try { //須要被檢測異常的代碼 } catch(異常類 變量)//改變量用

C++異常處理=>RTTI

/*對於RTTI(執行階段型別識別)主要包含dynamic_cast,typeid,type_info*/ 1.dynamic_cast 對於指標轉換,從派生類轉換成基類指標將會返回物件地址,如果轉換錯誤將會返回NULL 對於引用轉換,轉換錯誤將會引發bad_cast異常,在標頭檔案&l

Spring Cloud實戰小貼士:Zuul統一異常處理

在前幾天釋出的《Spring Cloud實戰小貼士:Zuul統一異常處理(一)》一文中,我們詳細說明了當Zuul的過濾器中丟擲異常時會發生客戶端沒有返回任何內容的問題以及針對這個問題的兩種解決方案:一種是通過在各個階段的過濾器中增加try-catch塊,實現過濾器內部的異常處理;另一種是

iOS崩潰 捕獲異常處理

  網上基本使用的都是同一個版本的異常捕獲,我能瞭解到的關於signal異常捕獲的方法也是通過這個版本。我在自己理解的基礎上對於這個版本進行了一些修改,也添加了一些註釋。下面貼出主要的程式碼。   完整程式碼的下載地址:git /*! * 異常的處理

js中的異常捕獲 try{} catch{}

事件輪循中,丟擲的異常資訊會丟失函式呼叫的路徑,所以每一步都要進行錯誤處理 function a(){ b(); } function b(){ c(); } function c(){ // setTimeout(() => { // throw new

iOS中執行緒Call Stack的捕獲和解析

1. 部分參考資料 做這一塊時也是查閱了很多連結和書籍,包括但不限於: 以及很多Google Search。 2. 相關API和資料結構 由於我們在上面回溯執行緒呼叫棧拿到的是一組地址,所以這裡進行符號化的輸入輸出應該分別是地址和符號,介面設

Java千百問_04異常處理002_java如何捕獲異常

1、如何捕獲異常 捕獲的方法是使用try/catch關鍵字。將可能產生異常,並且需要捕獲的程式碼塊使用try/catch圍繞,如果產生了異常即可捕獲到,將直接中斷try程式碼塊,同時執行catch

長款或短款的處理

要求 原則 職業 工作 部分 問題 特征 人的 結果 出納人員長年與現金和銀行存款打交道,出現長款或短款是難免的。但是要把差錯率降至最低並徹底杜絕,這就要求出納人員於日常結算時,在“細心”和“認真”上下硬工夫才行。而千萬不能長了款便放一邊了之,短了款自己掏腰包補齊。有果必有

實習培訓——Java異常處理8

如何工作 出了 我們 個數 試圖 類對象 bject epo 很多 實習培訓——Java異常處理(8) Java 異常處理 異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。 比如說,你的代碼少了一個分號,那麽運行出來結果是提示是錯誤 java

spring boot 1.5.4 統一異常處理

springboot springboot1.5.4 springboot整合springdatajpa springboot集成jdbctemplate springboot異常處理 上一篇:springboot 1.5.4 配置文件詳解(八) 1 Spring Boot統一異

Python 日誌處理 使用正則表達式處理Nginx 日誌

表示 cnblogs sunday sta return __main__ pattern eth 解析 使用正則表達式來處理Nginx 日誌 一、 先對單行的日誌進行分組正則匹配,返回匹配後的結果(字典格式): from datetime import dateti

Linux故障處理更改root密碼和修復文件系統

無法識別 丟失 ges 包括 故障處理 磁盤 free roo ext4 Linux故障處理(二)更改root密碼和修復文件系統一、遺忘root用戶的密碼大多數時候Linux主機中具有root權限的用戶只有一個,因此需要通過其他途徑來重設root賬號密碼。最簡單的途徑是在開

CSS兼容處理

bsp test -h lock 現在 -s play AC orm 在IE6及以下版本的瀏覽器中定義小高度: 解決方法:#text { overflow:hidden; height:1px; font-size:0; line-height:0;} 具體詳解:IE6

圖像處理

pan data spa jpg class int gpo UC top opencv訪問圖像像素: Mat image = imread("C:\\Users\\Administrator\\Desktop\\image.jpg"); ofst

錯誤和異常處理7

為什麽 nbsp 實現 str ron strong 指令 異常處理 處理 配置指令 錯誤日誌 異常處理 為什麽異常處理很方便 PHP的異常處理實現 SPL異常 錯誤和異常處理(7)

【Java入門提高篇】Day16 Java異常處理

http final 自定義異常 2個 輸入 也有 推薦 錯誤 num   今天繼續講解java中的異常處理機制,主要介紹Exception家族的主要成員,自定義異常,以及異常處理的正確姿勢。 Exception家族   一圖勝千言,先來看一張圖。   Excepti

面向物件【day08】:異常處理

本節內容 1、概述 2、異常梳理 3、異常梳理流程圖 4、異常大全 5、自定義異常 一、概述   異常處理是當程式出錯了,但是我們又不想讓使用者看到這個錯誤,而且我在寫程式的時候已經預料到了它可以出現這樣的錯誤,出現這樣的錯誤代表著什麼,我們可以提前處理這些個錯誤 二、異常處理 2.1 處理

安卓異常處理筆記

(1)java.lang.IllegalStateException: Observer [email protected] was not registered. 這個報錯在異常資訊裡是看不到關於程式裡有報錯的地方的,而這個報錯是

python自然語言處理

1詞性標註 簡單的理解就是對詞性(POS)進行標註,但在不同的領域,詞性可能是不同的,Penn Treebank pos標記庫:https://blog.csdn.net/u010099495/article/details/46776617 其中程式需要安裝兩個依賴包 nlt