iOS try-catch機(jī)制與SIGABRT信號

iOS程序異常crash捕獲與攔截

對于iOS應(yīng)用try-catch并不能捕獲所有異常,也就是說有時(shí)候我們加上了try-catch可是程序還是會Crash,目前我所總結(jié)有兩種:一種是由EXC_BAD_ACCESS引起的,原因是訪問了不屬于本進(jìn)程的內(nèi)存地址,有可能是訪問已被釋放的內(nèi)存;另一種是未被捕獲的Objective-C異常(NSException),導(dǎo)致程序向自身發(fā)送了SIGABRT信號而崩潰。其實(shí)對于未捕獲的Objective-C異常,我們是有辦法將它記錄下來的,如果日志記錄得當(dāng),能夠解決絕大部分崩潰的問題。下面對于UI線程與后臺線程分別說明。

傳統(tǒng)的捕獲異常的方式中所熟知try-catch-finally,但有些時(shí)候一些iOS系統(tǒng)的api是原生的C語法格式例如:sqlite3.c,UnGzip.c這些是不支持OC或者C++的try-catch機(jī)制即使有異常也是捕獲不到,或者是一些內(nèi)存的問題等在try里面還是會無情的Crash。

try-catch

iOSSDK中提供了一個(gè)現(xiàn)成的函數(shù)NSSetUncaughtExceptionHandler用來做異常處理,但功能非常有限,而引起崩潰的大多數(shù)原因如:內(nèi)存訪問錯(cuò)誤,重復(fù)釋放等錯(cuò)誤就無能為力了,因?yàn)檫@種錯(cuò)誤它拋出的是Signal,所以必須要專門做Signal處理。代碼如下

NSSetUncaughtExceptionHandler

通過上圖的操作我們就完成了iOS SDK給我們提供的捕捉異常處理,我們只需要在HandleException方法中紀(jì)錄我們的異常信息即可。但這僅僅是捕獲一般的OC異常信息,對于Signal異常信號我們?nèi)匀粺o法捕獲到,此時(shí)我們就需要去注冊一些Signal信號來幫助我們捕獲Signal異常。首先介紹一下Signal信號:

signal。既信號量,ios是Linux內(nèi)核,在程序發(fā)生未捕獲異常時(shí),程序會向自身發(fā)送信號(SIGABRT、SIGBUS、SIGHUP等。。。),然后程序直接閃退。。。有時(shí)候這是無可避免的。作為一款優(yōu)秀的軟件,必須要有異常報(bào)告模塊,讓用戶給你發(fā)送異常報(bào)告信息。這樣才能根據(jù)異常信息來做相應(yīng)地Debug工作。在iOS SDK

signal.h里面有31種信號方式這里不做一一解釋。

信號類型

下面說一下怎么注冊這些信號量來幫助我們記錄到異常信息。代碼如下:

installSianalHandler方法
注冊SIGNAL信號

上圖中的signal(SIGHUP, void(*)(int));方法為iOS signal.h中的注冊信號量的方法其中第二個(gè)參數(shù)為收到信號的回調(diào)函數(shù),我們通過這個(gè)回調(diào)函數(shù)可以根據(jù)我們的需求做一些處理。

小結(jié):try-Catch只能幫助我們攔截一些bug或者幫助我們提供一些錯(cuò)誤信息,要從根本上解決程序的問題還需要不斷的調(diào)試,優(yōu)化。

作者:Olivia_Zqy

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,291評論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內(nèi)容