NSError.setUserInfoValueProvider(forDomain:provider:)
是MacOS 10.11 / iOS 9中引入的一种方法,它使用块为给定的错误域填充userInfo
的{{1}}字典,从而避免了很多重复并重复可能会抛出的代码。
我试图这样使用它:
NSError
呼叫站点如下:
if NSError.userInfoValueProvider(forDomain: "Test") == nil {
NSError.setUserInfoValueProvider(forDomain: "Test"){ err, userInfoKey in
print("This is an error:", err, userInfoKey)
return nil
}
}
引发错误时,日志中会填充“这是一个错误:”,但是永远不会打印出错误本身或throw NSError(domain: "Test", code: 0, userInfo: nil)
。程序最终中止并在日志中显示最后一条消息:
警告:无法执行支持代码来读取Objective-C类数据 进行中。这可能会降低类型信息的质量 可用。
答案 0 :(得分:0)
问题是在
中打印err
print("This is an error:", err, userInfoKey)
递归调用相同的值提供程序,因为确定了错误的字符串表示形式。然后,该程序最终因堆栈溢出而崩溃。您可以通过在该行上设置断点来验证这一点。
如果将行更改为
print("This is an error:", userInfoKey)
然后一切都会按预期进行。