如何从catch子句中的NSError获取userInfo

时间:2015-07-03 08:19:31

标签: swift error-handling swift2

如果我有投掷方法,就像这样:

func doSomethingWithString(string:String) throws {
  guard string.characters.count > 0 else {
    throw NSError(domain: "CustomErrorDomain", code: 42, userInfo: ["foo" : "bar"])
  }
  // Do something with string...
}

然后我尝试调用它并阅读userInfo

do {
  try doSomethingWithString("")
} catch let error as NSError {
  print(error.domain)
  print(error.code)
  print(error.userInfo)
}

...它以空字典形式返回(但域和代码已正确填充):

CustomErrorDomain
42
[:]

但如果我加上这个额外的步骤:

do {
  try doSomethingWithString("")
} catch let e {
  let error = e as NSError
  print(error.domain)
  print(error.code)
  print(error.userInfo)
}

......它有效:

CustomErrorDomain
42
[foo: bar]

有人知道为什么会这样吗?

仅供参考 - 我正在使用Xcode 7 beta 2(7A121l)

1 个答案:

答案 0 :(得分:2)

这是一个错误,已在Xcode 7 Beta 4中修复。以下是发行说明(PDF,第15页)中的摘录:

  

Xcode 7 beta 4中已解决的问题 - Swift 2.0和Objective-C

     

当   抛出对Swift中的NSError实例的引用,即Swift   运行时不再丢失原始NSError的userInfo(如果是)   被捕为NSError。 Swift运行时现在保留了它的标识   原始的NSError。例如,这个断言现在成立:

 let e = NSError(...)
 do {
   throw e
 } catch let e2 as NSError {
   assert(e === e2)
 }