作者:jimi2018 | 来源:互联网 | 2023-09-04 23:20
可能在iOS中不太经常用到,但是了解一下还是没坏处
@try{
代码块1(可能出现异常的语句)
//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 } @catch(Exception e){
代码块2(发生异常时进行处理)
//除非try里面执行代码发生了异常,否则这里的代码不会执行}@finally{
代码块3(始终要进行处理的语句)
//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally }catch是抓取代码块1中的异常代码块2是出异常后的处理代码块3是不管出不出异常都会执行,如果代1或代2中有return,代3会在return后执行
总结:
1、不管有木有出现异常,finally块中代码都会执行;2、当try和catch中有return时,finally仍然会执行;3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
这个异常捕获机制就是哪里用到就写到那里
以下程序已测试并通过:
设备:iOS 8模拟器中
开发工具:XCode6.1
使用@try、catch捕获异常:
以下是最简单的代码写法,其中@finally可以去掉:
123456789 |
@ try { } @ catch (NSException *exception) { } @finally { } |
在这里举多一具比较详细的方法,抛出异常:
12345678910111213141516 |
@ try { [self tryTwo]; } @ catch (NSException *exception) { NSLog(@ "%s\n%@" , __FUNCTION__, exception); } @finally { NSLog(@ "我一定会执行" ); } NSLog(@ "try" ); |
tryTwo方法代码:
12345678910111213141516171819202122 |
- (void)tryTwo { @ try { NSString *str = @ "abc" ; [str substringFromIndex:111]; } @ catch (NSException *exception) { NSLog(@ "%s\n%@" , __FUNCTION__, exception); } @finally { NSLog(@ "tryTwo - 我一定会执行" ); } NSLog(@ "如果这里抛出异常,那么这段代码则不会执行" ); } |
为了方便大家理解,我在这里再说明一下情况:
如果6抛出异常,那么执行顺序为:1->5->6->8->3->4
如果6没抛出异常,那么执行顺序为:1->5->7->8->9->3->4
2)部分情况的崩溃我们是无法避免的,就算是QQ也会有崩溃的时候。因此我们可以在程序崩溃之前做一些“动作”(收集错误信息),以下例子是把捕获到的异常发送至开发者的邮箱。
AppDelegate.m
1234567891011121314151617181920212223242526 |
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { 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]]; } |