在 swift 4 中使用 NSSetUncaughtExceptionHandler
Using NSSetUncaughtExceptionHandler in swift 4
我正尝试在我的项目中使用全局错误处理,如下所示:
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
}
但是我在编码时遇到这个错误:
A C function pointer cannot be formed from a closure that captures
context.
我搜索了很多,但找不到任何答案。还有什么我需要做的吗?
更新:
我发现问题是因为我在块内声明了变量。发生异常时如何处理显示视图?
总结以上讨论:您的方法存在各种问题:
NSSetUncaughtExceptionHandler
的参数是一个C函数指针。您可以在 Swift 中传递闭包,但前提是闭包不捕获任何上下文。在您的情况下,闭包不能使用 self
。来自 How to use instance method as callback for function which takes only func or literal closure 的解决方案?不能在这里使用,因为 NSSetUncaughtExceptionHandler()
没有“上下文”参数。
即使您设法在异常处理程序中引用应用程序委托:它可以在任何线程上调用,因此调用任何 UI 相关方法都可以是未定义的行为,例如添加视图或标签。
NSSetUncaughtExceptionHandler
仅捕获 Objective-C 异常,但不捕获 Swift 错误(来自 throw
)或 Swift 运行时异常(例如作为“意外发现 nil”)。
即使捕获到异常,您也无法以程序继续执行的方式“处理”它。还是会崩溃。
您在评论中写道
I want to handle it for when I get null values from my API ... but to be on a safe side I want to prevent app from crash.
异常处理程序不是用于此目的的正确工具。使用可选绑定、可选转换、守卫等来处理响应并避免运行时异常。
我正尝试在我的项目中使用全局错误处理,如下所示:
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
}
但是我在编码时遇到这个错误:
A C function pointer cannot be formed from a closure that captures context.
我搜索了很多,但找不到任何答案。还有什么我需要做的吗?
更新:
我发现问题是因为我在块内声明了变量。发生异常时如何处理显示视图?
总结以上讨论:您的方法存在各种问题:
NSSetUncaughtExceptionHandler
的参数是一个C函数指针。您可以在 Swift 中传递闭包,但前提是闭包不捕获任何上下文。在您的情况下,闭包不能使用self
。来自 How to use instance method as callback for function which takes only func or literal closure 的解决方案?不能在这里使用,因为NSSetUncaughtExceptionHandler()
没有“上下文”参数。即使您设法在异常处理程序中引用应用程序委托:它可以在任何线程上调用,因此调用任何 UI 相关方法都可以是未定义的行为,例如添加视图或标签。
NSSetUncaughtExceptionHandler
仅捕获 Objective-C 异常,但不捕获 Swift 错误(来自throw
)或 Swift 运行时异常(例如作为“意外发现 nil”)。即使捕获到异常,您也无法以程序继续执行的方式“处理”它。还是会崩溃。
您在评论中写道
I want to handle it for when I get null values from my API ... but to be on a safe side I want to prevent app from crash.
异常处理程序不是用于此目的的正确工具。使用可选绑定、可选转换、守卫等来处理响应并避免运行时异常。