@try/catch笔记

背景

objc中经常需要将网络返回的数据解析到自定义的类中,以方便后续使用,通常我们可以这么做:

object.name = [dic valueForKey:@"name"];  
object.place = [dic valueForKey:@"place"];  
object.number = [dic valueForKey:@"number"];  
object.level = [dic valueForKey:@"level"];  
object.major = [dic valueForKey:@"major"];  
object.class = [dic valueForKey:@"class"];  

但是如果用KVC模式的话就上面的操作就可以简化成

[object setValuesForKeysWithDictionary:dic];

当对象的属性多的时候上述方法可以节省很多时间,但是它也有个很严重的问题,比如说网络出了问题,返回来的数据里面并没有name这个key。

那么前者 object.name = [dic valueForKey:@"name"];就会返回nil,但是后者[object setValuesForKeysWithDictionary:dic];应用就会直接crash。

为了让后者在异常时也不crash而是输出错误,继续执行,我们需要用到@try/catch。

@try/catch

使用@try/catch只需要将可能使程序crash的代码放到@try里面,像这样:

    @try {
        [objcet setValuesForKeysWithDictionary:dic];
    }
    @catch (NSException *exception) {
        NSLog(@"\nname:%@\nreason:%@",exception.name,exception.reason);
    }

暂时只会简单地使用,等会更高级的用法后再回来补充。


参考:

rypress:Exceptions & Errors

objccn: issue 7-3