NSException:如何添加userData并重新抛出?

问题描述:

我想为我的应用程序写一个全局异常处理例程。它的想法是暂时将异常存储在内存中,并最终将其报告给服务器,而不是打扰用户。NSException:如何添加userData并重新抛出?

我想收集尽可能多的信息,所以它看起来像在异常中的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?

是的,你需要创建新的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]; 
} 
+0

不够公平。多一点faff然后我希望,但这不是PHP ;-)我不知道mutableCopy,这有所帮助,谢谢。 –

一个好的做法是提高你自己的NSException,或者最好只是通过一个NSError,封装原来的一个,可能会使用userInfo

对于您的情况,您不能在NSException上致电setValue:,只是因为它无法处理它。 将NSException视为只读.`

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