NSException:如何添加userData和rethrow?

时间:2014-04-23 11:09:29

标签: objective-c cocoa nsexception

我正在尝试为我的应用编写一个全局异常处理例程。这个想法是它会暂时将异常存储在内存中并最终报告给服务器,而不是打扰用户。

我想收集尽可能多的信息,因此异常中的userInfo字段似乎是存储它的地方。然后我可以简单地重新抛出异常,或者如下例所示,直接将它报告给全局异常处理程序并继续。

         @catch (NSException *e) {
             NSLog(@"Got exception parsing XML stack %@", stack);
             [e setValue:stack forKey:@"stack"];
             [__zmsGlobals exception:e context:@"Parsing data"];
             [self cleanupAfterScan];
             [self report:[NSError errorWithDomain:@"zaomengshe.com" code:104 userInfo:e.userInfo] selector:failureSelector];
         }

这只是关于如何在userInfo字段中设置值的猜测。 NSException似乎有一个setValue方法,但它不起作用。它抛出“这个类不是密钥值的密钥值编码兼容。”

那么最好的方法是什么?我是否必须从头开始构建新的NSException?

2 个答案:

答案 0 :(得分:1)

是的,您需要创建新的NSException对象,复制/添加您想要的部件并再次调用raise。

@catch (NSException* exception)
{
    NSMutableDictionary* d = [[exception userInfo] mutableCopy];
    [d setObject:@"new info" forKey:@"newKey"];
    NSException * e = [NSException exceptionWithName:[exception name] reason:[exception reason] userInfo:d];
    [e raise];
}

答案 1 :(得分:0)

一个好的做法是提升自己的NSException,或者最好只传递一个NSError,封装原来的userInfo,可以使用setValue:

在您的情况下,您无法在NSException上致电NSException,只是因为它无法处理它。 将{{1}}视为只读。

更一般地说,不应将异常用作消息,而是更喜欢错误。