對於應用閃退,相信大家見到最多的就是「異常丟擲」這個狀況,也就是
n***ception這個么蛾子搞的鬼。那麼今天就來面對它。也就是利用@try 語法來捕獲它。並且做出相應的善後工作。不讓程式閃退。
模擬乙個異常 : array 是不可變陣列,然後我們在函式dosomething 中給他addobject
-(void)dosomething:(nsmutablearray*)input
nsarray* array = [nsarray new];
[self dosomething:array];
然後我們執行,結果可想而知,程式閃退,並且輸出如下資訊:
2014-10-29 16:51:35.567 warning[3901:133943] -[__nsarrayi addobject:]: unrecognized selector sent to instance 0x786385f0
*** first throw call stack:
( 0 corefoundation 0x008b0df6 __exceptionpreprocess + 182
1 libobjc.a.dylib 0x0053aa97 objc_exception_throw + 44
2 corefoundation 0x008b8a75 -[nsobject(nsobject) doesnotrecognizeselector:] + 277
3 corefoundation 0x008019c7 ___forwarding___ + 1047
4 corefoundation 0x0080158e _cf_forwarding_prep_0 + 14
12 frontboardservices 0x031d79de __37-[fbsworkspace clientendtransaction:]_block_invoke_2 + 71
13 frontboardservices 0x031d746f __40-[fbsworkspace _performdelegatecallout:]_block_invoke + 54
14 frontboardservices 0x031e9425 __31-[fbsserialqueue performasync:]_block_invoke + 26
15 corefoundation 0x007d47a0 __cfrunloop_is_calling_out_to_a_block__ + 16
16 corefoundation 0x007ca0b3 __cfrunloopdoblocks + 195
17 corefoundation 0x007c9f0b __cfrunlooprun + 2715
18 corefoundation 0x007c91ab cfrunlooprunspecific + 443
19 corefoundation 0x007c8fdb cfrunloopruninmode + 123
22 warning 0x0005ccfd main + 141
23 libdyld.dylib 0x02bfeac9 start + 1
)libc++abi.dylib: terminating with uncaught exception of type n***ception
異常原因可以看到,程式也如願閃退。
我們對上面的**做一些修改。
nsarray* array = [nsarray new];
@try
@catch (n***ception *exception)
@finally
重新跑一遍。輸出log如下2014-10-29 16:55:31.308 warning[3942:136578] -[__nsarrayi addobject:]: unrecognized selector sent to instance 0x7be13470
2014-10-29 16:55:31.309 warning[3942:136578] ------[__nsarrayi addobject:]: unrecognized selector sent to instance 0x7be13470
2014-10-29 16:55:31.309 warning[3942:136578] over
應用程式也沒有閃退。
我來解釋一下這段**以及log輸出。
使用try 語法呼叫那些可能導致異常的**段。這裡就乙個函式呼叫。
如果有異常丟擲,異常被catch捕獲,並且你可以知道異常資訊。也就是exception。
最後finally無論有沒有異常都會走。
log 第一行是應用自身丟擲的異常log,可見在應用丟擲異常之後,馬上被我們的catch 捕獲到,並且按照我們的要求輸出了異常資訊。
最後進入finally裡面。
當然這個語法是可以巢狀。確保異常一定會得到處理。
可以在函式 dosomething 裡面加上try 語法
-(void)dosomething:(nsmutablearray*)input
@catch (n***ception *exception)
@finally
}
這樣在函式內部,也會有乙個捕獲異常的過程。值得一說的是,如果你在函式內部不能處理,需要丟擲去讓外層處理。
這樣外層依然能在@catch中抓到這個異常。
學會用Git 分支
依據git使用手冊 第三節關於分支的內容,使用如下 新建new分支的檔案與master分支的檔案操作有如下3中關係 master分支下修改了master分支下的文件 new分支下修改了new分支下的文件 master分支和new分支下共同修改了同乙個文件 將new分支合併到master分支的結果為 ...
php中try catch捕獲異常
php中try catch 語句概述 php5新增了類似於其它語言的異常處理模組。在 php 中所產生的異常可被 throw語句丟擲並被 catch 語句捕獲。注 一定要先拋才能獲取 需要進行異常處理的 都必須放入 try 塊內,以便捕獲可能存在的異常。每乙個 try 至少要有乙個與之對應的 cat...
try catch捕獲不同的異常
目的 想要使用try.catch捕獲不同的異常 eg1 建立三個exception class aexception extends exception class bexception extends exception class cexception extends exception 乙個t...