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

Posted

技术标签:

【中文标题】NSException:如何添加 userData 并重新抛出?【英文标题】:NSException: how to add userData and rethrow? 【发布时间】:2014-04-23 11:09:29 【问题描述】:

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

我想收集尽可能多的信息,因此异常中的 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 吗?

【问题讨论】:

【参考方案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];

【讨论】:

很公平。比我希望的要多一点,但这不是 php ;-) 我不知道 mutableCopy,这有点帮助,谢谢。【参考方案2】:

一个好的做法是提出自己的NSException,或者最好只传递一个NSError,封装原来的userInfo

在你的情况下,你不能在NSException 上调用setValue:,只是因为它不处理它。 将NSException 视为只读。`

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

【讨论】:

以上是关于NSException:如何添加 userData 并重新抛出?的主要内容,如果未能解决你的问题,请参考以下文章

在 UIView 中将 Traget 添加到 UIButton。收到错误“以 NSException 类型的未捕获异常终止”

获取 NSException 错误崩溃应用程序

表视图不断给出 NSException 和崩溃

带有 UIImagePickerController 的 NSException

如何 NSException 获取本地化的 NSLocalizedDescription

如何调试:libc++abi.dylib:以 NSException 类型的未捕获异常终止?