NSError.setUserInfoValueProvider无限循环

时间:2018-10-30 15:05:54

标签: swift foundation nserror

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类数据   进行中。这可能会降低类型信息的质量   可用。

1 个答案:

答案 0 :(得分:0)

问题是在

中打印err
print("This is an error:", err, userInfoKey)

递归调用相同的值提供程序,因为确定了错误的字符串表示形式。然后,该程序最终因堆栈溢出而崩溃。您可以通过在该行上设置断点来验证这一点。

如果将行更改为

print("This is an error:", userInfoKey)

然后一切都会按预期进行。