可見的異常

2021-06-29 16:44:39 字數 3167 閱讀 1550

雖然大家都不願意看到程式崩潰,但可能崩潰是每個應用必須面對的現實,既然崩潰已經發生,無法阻擋了,那我們就讓它崩也崩得淡定點吧。

ios sdk中提供了乙個現成的函式 nssetuncaughtexceptionhandler 用來做異常處理,但功能非常有限,而引起崩潰的大多數原因如:記憶體訪問錯誤,重複釋放等錯誤就無能為力了,因為這種錯誤它丟擲的是signal,所以必須要專門做signal處理。首先定義乙個uncaughtexceptionhandler類,**如下:

#import #import @inte***ce uncaughtexceptionhandler : nsobject  

+(void) installuncaughtexceptionhandler;

@end

//利用 nssetuncaughtexceptionhandler,當程式異常退出的時候,可以先進行處理,然後做一些自定義的動作,比如下面一段**,就是網上有人寫的,直接在發生異常時給某人傳送郵件,  

void uncaughtexceptionhandlers (n***ception *exception);

#import "uncaughtexceptionhandler.h"  

#include #include nsstring * const uncaughtexceptionhandlersignalexceptionname = @"uncaughtexceptionhandlersignalexceptionname";

nsstring * const uncaughtexceptionhandlersignalkey = @"uncaughtexceptionhandlersignalkey";

nsstring * const uncaughtexceptionhandleraddresseskey = @"uncaughtexceptionhandleraddresseskey";

volatile int32_t uncaughtexceptioncount = 0;

const int32_t uncaughtexceptionmaximum = 10;

const nsinteger uncaughtexceptionhandlerskipaddresscount = 4;

const nsinteger uncaughtexceptionhandlerreportaddresscount = 5;

void mysignalhandler(int signal)

if(signal==11)

nsmutabledictionary *userinfo = [nsmutabledictionary dictionarywithobject:[nsnumber numberwithint:signal] forkey:uncaughtexceptionhandlersignalkey];

nsarray *callstack = [uncaughtexceptionhandler backtrace];

[userinfo setobject:callstack forkey:uncaughtexceptionhandleraddresseskey];

[[[[uncaughtexceptionhandler alloc] init] autorelease]

performselectoronmainthread:@selector(handleexception:)

withobject:

[n***ception

exceptionwithname:uncaughtexceptionhandlersignalexceptionname

reason:

[nsstring stringwithformat:

nslocalizedstring(@"signal %d was raised.\n"

@"%@", nil),

userinfo:

[nsdictionary

dictionarywithobject:[nsnumber numberwithint:signal]

forkey:uncaughtexceptionhandlersignalkey]]

waituntildone:yes];

} @implementation uncaughtexceptionhandler

+(void) installuncaughtexceptionhandler

+ (nsarray *)backtrace

free(strs);

return backtrace;

} - (void)alertview:(uialertview *)analertview clickedbuttonatindex:(nsinteger)anindex

} - (void)handleexception:(n***ception *)exception

} cfrelease(allmodes);

nssetuncaughtexceptionhandler(null);

signal(sigabrt, sig_dfl);

signal(sigill, sig_dfl);

signal(sigsegv, sig_dfl);

signal(sigfpe, sig_dfl);

signal(sigbus, sig_dfl);

signal(sigpipe, sig_dfl);

if ([[exception name] isequal:uncaughtexceptionhandlersignalexceptionname])

else

} void uncaughtexceptionhandlers (n***ception *exception)

@end

[uncaughtexceptionhandler installuncaughtexceptionhandler];  

nssetuncaughtexceptionhandler (&uncaughtexceptionhandlers);

原文:

003 事務到底可見不可見

檢視資料庫的事務配置 mysql show variables like transaction isolation variable name value transaction isolation read committed 1 什麼是事務 事務是指一條或者一組語句 組成乙個單元,這個單元要麼...

繼承的可見性

繼承的可見性 在c 中通過繼承,子類將擁有除父類的 建構函式和析構函式以外的所有的成員.注意這裡的 擁有 和 可見性 是兩個概念.擁有某個成員是指該成員確確實實地存在於該類中,但如果該成員的訪問許可權不允許該成員在繼承的子類中可見 比如private,internal 我們將不能在子類中對他們進行操...

邊的可見性

在 opengl 裡面,邊是具有可見性的,即我們可以讓一條邊顯示或不顯示在螢幕上,有時候我們必須讓一些邊隱藏起來,就像前面說過的利用繪製凸多邊形來繪製凹多邊形的時候就需要隱藏掉一些邊。邊的可見性是利用 gledgeflag 函式來說明的,該函式有乙個引數,且只為 true 或 false 分別表示可...