@try/catch笔记

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

1
2
3
4
5
6
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模式的话就上面的操作就可以简化成

1
[object setValuesForKeysWithDictionary:dic];

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

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

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

#@try/catch

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

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

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


参考:

rypress:Exceptions & Errors

objccn: issue 7-3