IOS捕獲異常,常用的異常處理方法。,ios捕獲處理方法
前言:在開發APP時,我們通常都會需要捕獲異常,防止應用程式突然的崩潰,防止給予使用者不友好的一面。其實OBJECT-C的異常處理方法和JAVA的雷同,懂JAVA的朋友一看就懂。我為什麼要寫這篇博文呢?因為我發現百度上的介紹方法,很多都不是我想要的,而我想要的又說得不清楚,重點是大家都是直接複製別人的代碼。。。於是不多說,大家往下看~~~
以下程式已測試並通過:
裝置:IOS8模擬器中
開發工具:XCode6.1
使用@try、catch捕獲異常:
以下是最簡單的代碼寫法,其中@finally可以去掉:
@try { // 可能會出現崩潰的代碼}@catch (NSException *exception) { // 捕獲到的異常exception}@finally { // 結果處理}
在這裡舉多一具比較詳細的方法,拋出異常:
@try { // 1 [self tryTwo];}@catch (NSException *exception) { // 2 NSLog(@"%s\n%@", __FUNCTION__, exception);// @throw exception; // 這裡不能再拋異常}@finally { // 3 NSLog(@"我一定會執行");}// 4// 這裡一定會執行NSLog(@"try");
tryTwo方法代碼:
- (void)tryTwo{ @try { // 5 NSString *str = @"abc"; [str substringFromIndex:111]; // 程式到這裡會崩 } @catch (NSException *exception) { // 6// @throw exception; // 拋出異常,即由上一級處理 // 7 NSLog(@"%s\n%@", __FUNCTION__, exception); } @finally { // 8 NSLog(@"tryTwo - 我一定會執行"); } // 9 // 如果拋出異常,那麼這段代碼則不會執行 NSLog(@"如果這裡拋出異常,那麼這段代碼則不會執行");}
為了方便大家理解,我在這裡再說明一下情況:
如果6拋出異常,那麼執行順序為:1->5->6->8->3->4如果6沒拋出異常,那麼執行順序為:1->5->7->8->9->3->4
2)部分情況的崩潰我們是無法避免的,就算是QQ也會有崩潰的時候。因此我們可以在程式崩潰之前做一些“動作”(收集錯誤資訊),以下例子是把捕獲到的異常發送至開發人員的郵箱。
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler); return YES;}void UncaughtExceptionHandler(NSException *exception) { /** * 擷取異常崩潰資訊 */ NSArray *callStack = [exception callStackSymbols]; NSString *reason = [exception reason]; NSString *name = [exception name]; NSString *content = [NSString stringWithFormat:@"========異常錯誤報表========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[callStack componentsJoinedByString:@"\n"]]; /** * 把異常崩潰資訊發送至開發人員郵件 */ NSMutableString *mailUrl = [NSMutableString string]; [mailUrl appendString:@"mailto:test@qq.com"]; [mailUrl appendString:@"?subject=程式異常崩潰,請配合發送異常報告,謝謝合作!"]; [mailUrl appendFormat:@"&body=%@", content]; // 開啟地址 NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];}
發送郵件的操作,具體請查看我的另一篇博文:
IOS開發-發送郵件(E-mail)方法整理合集(共3種)
博文作者:GarveyCalvin
博文出處:http://www.cnblogs.com/GarveyCalvin/
本文著作權歸作者和部落格園共有,歡迎轉載,但須保留此段聲明,並給出原文連結,謝謝合作!