【问题标题】:Update NSError UserInfo更新 NSError 用户信息
【发布时间】:2013-08-26 18:13:37
【问题描述】:

我正在尝试使用更多信息更新 NSError 对象。例如,一个 api 调用可能会失败,我想用视图控制器信息(导致错误的方法名称、客户端消息、任何附加信息)更新从 api 类返回的错误对象。 UserInfo 字典没有设置方法,尝试为字典设置值会引发异常(我相信不符合键值代码)。我曾考虑使用更新的用户信息创建一个新的 NSError 对象,但我不确定是否会丢失信息。

问题

更新 NSError 对象的用户信息字典的最佳方法是什么?

【问题讨论】:

  • 将现有的 userInfo 与你的合并怎么样?
  • 我能想到的唯一方法是创建一个新的 NSError 实例,但我不确定这是否会导致我丢失原始 NSError 对象中的任何数据。您如何建议合并用户信息?

标签: ios objective-c error-handling nserror


【解决方案1】:

最简单的方法是获取userInfo 字典的可变副本,然后添加您喜欢的任何内容。然后你必须创建一个新的NSError(因为没有 setUserInfo: 方法)与原来的域和代码相同。

【讨论】:

  • 这样做会丢失任何其他详细信息吗?
  • 请注意不要使用 NSError 文档的 Constants 部分中列出的任何键,否则您最终可能会覆盖现有信息。
  • 我正在使用 Flurry 并且 Flurry 在记录错误时需要一个 NSError 类。我之前有一个自定义错误对象,但它导致了日志记录问题。
  • ipmcc 的answer 是解决此问题的最佳方法。
  • 我同意。我喜欢 ipmcc 的方法,但对于我需要做的事情来说,它是沉重的。你的方法效率低,但简单,我不会有一堆嵌套的 NSErrors。
【解决方案2】:

典型的方法是自己创建一个新的NSError,然后将原始的NSError 放入userInfo 字典中的键NSUnderlyingErrorKey 下。这是一个稍微不同的结果,但我可以说NSErrors 是故意不可变的。

【讨论】:

  • 我喜欢这种方法,但是对于我想要完成的事情(如果未在 api 中设置显示消息,请设置显示消息)来说,这太过分了,并且会让我头疼。跨度>
  • @ipmcc 你能解释一下这种不变性的原因吗?没有地方说原因。 (事实上​​,我没有成功找到任何相关信息)
【解决方案3】:

使用快速扩展很容易:

extension NSError {

  func addItemsToUserInfo(newUserInfo: Dictionary<String, String>) -> NSError {

    var currentUserInfo = userInfo
    newUserInfo.forEach { (key, value) in
      currentUserInfo[key] = value
    }
    return NSError(domain: domain, code: code, userInfo: currentUserInfo)
  }
}

用法:

var yourError = NSError(domain: "com.app.your", code: 999, userInfo: nil)
yourError = yourError.addItemsToUserInfo(["key1":"value1","key2":"value2"])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2014-02-20
    • 2016-10-03
    相关资源
    最近更新 更多