我正在尝试在我的项目中使用全局错误处理,如下所示:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
NSSetUncaughtExceptionHandler { (exception) in
print(exception)
let myView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
let errorLabel :UILabel = UILabel(frame: CGRect(x: 10, y: (UIScreen.main.bounds.height/2) - 25 , width: UIScreen.main.bounds.width - 20 , height: 50))
errorLabel.text = "Exception"
myView.addSubview(errorLabel)
self.window?.addSubview(myView)
}
return true
}
但是我在编码时收到此错误:
不能从捕获上下文的闭包中形成AC函数指针。
我进行了很多搜索,但找不到任何答案。我还有什么需要做的吗?
更新:
我发现问题是因为我在块内声明了变量。在发生异常时如何处理显示视图?
总结以上讨论:您的方法存在各种问题:
to的参数NSSetUncaughtExceptionHandler
是C函数指针。您可以在Swift中传递闭包,但前提是闭包不捕获任何上下文。在您的情况下,闭包不能使用self
。如何将实例方法用作仅需要函数或文字闭合的函数的回调中的解决方案?在这里不能使用,因为NSSetUncaughtExceptionHandler()
没有“ context”参数。
即使您设法在异常处理程序中引用应用程序委托,也可以:在任何线程上均可调用它,因此,调用与UI相关的任何方法(例如添加视图或标签)都可能是未定义的行为。
NSSetUncaughtExceptionHandler
仅捕获Objective-C异常,而不捕获Swift错误(来自throw
)或Swift运行时异常(例如“意外找到nil”)。
即使捕获到异常,也无法以程序随后继续的方式“处理”该异常。它仍然会崩溃。
您在评论中写道
当我从我的API中获取空值时,我想对其进行处理...但是为了安全起见,我想防止应用崩溃。
异常处理程序不是用于此目的的正确工具。使用可选的绑定,可选的强制转换,防护等来处理响应并避免运行时异常。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句