NSSetUncaughtExceptionHandler
我正在尝试在Rubymotion应用程序中使用全局异常处理程序。而且我不知道该怎么做,可能我使用的 Rubymotion 函数指针语法不正确。
在application(application, didFinishLaunchingWithOptions:launchOptions)
我有:
NSSetUncaughtExceptionHandler nil do |exception|
NSLog "exception handler block"
applicationFailedWithException(exception)
end
和处理程序(从未被调用):
def applicationFailedWithException(exception)
NSLog "applicationFailedWithException"
end
然后,在运行时,当某个 NoMethodError 发生在异常处理程序块中的某个地方时,也没有调用处理程序方法。我在模拟器和设备上都试过了——没有成功。
PS有没有办法在崩溃日志中获取ruby方法堆栈,崩溃日志中的最后一个应用程序方法始终是rb_rb2oc_exc_handler
而不是特定于应用程序的方法,这很奇怪。
谢谢
2015 年更新
似乎对于较新版本的 Rubymotion,您必须将对处理程序的引用保存在实例变量中,否则它将无法工作。所以它应该看起来像:
def application(application, didFinishLaunchingWithOptions:launchOptions)
@exceptionHandler = lambda { |exception| uncaughtExceptionHandler(exception) }
# or you can use a method reference, which is the same
# @exceptionHandler = method :uncaughtExceptionHandler
NSSetUncaughtExceptionHandler @exceptionHandler
...
end
def uncaughtExceptionHandler(exception)
# log it or send it to crashlytics / flurry / whatever
NSLog "Fatal exception catched\nName: #{exception.name}\nReason: # {exception.reason}\nInfo#{exception.userInfo}"
end