gpt4 book ai didi

ios - 从 Rubymotion 调用 NSSetUncaughtExceptionHandler

转载 作者:行者123 更新时间:2023-11-28 22:49:12 26 4
gpt4 key购买 nike

我正在尝试在 Rubymotion 应用中使用 NSSetUncaughtExceptionHandler 连接一个全局异常处理程序。而且我不知道该怎么做,可能是我错误地使用了 Rubymotion 函数指针语法。

application(application, didFinishLaunchingWithOptions:launchOptions) 我有:

NSSetUncaughtExceptionHandler nil do |exception|
NSLog "exception handler block"
applicationFailedWithException(exception)
end

和处理程序(从不调用):

def applicationFailedWithException(exception)
NSLog "applicationFailedWithException"
end

然后,在运行时,当某个地方发生 NoMethodError 时,异常处理程序既不会阻止,也不会调用处理程序方法。我在模拟器和设备上都试过了——没有成功。

附言有没有办法在崩溃日志中获取 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

最佳答案

为了让它工作,我必须将一个 block 分配给一个变量,然后使用该变量:

handler = lambda do |exception|
NSLog "Exception Name: #{exception.name}"
end
NSSetUncaughtExceptionHandler(handler)

如果我随后在 REPL 中输入类似 NSException.raise("test", format: "test") 的内容,我将看到 NSLog 执行以下操作:

2012-09-11 09:33:05.949 exc[14723:c07] Exception Name: test
2012-09-11 09:33:05.950 exc[14723:c07] *** Terminating app due to uncaught exception 'test', reason: 'test'
*** First throw call stack:
(0x1647022 0x22bcd6 0x15efa48 0x15ef9b9 0x8f00743 0xe3c0c 0x8f0031a 0x8f000ad 0xd4c9fa2 0x259e8d9 0x259f509 0x157e803 0x157dd84 0x157dc9b 0x261f7d8 0x261f88a 0x563626 0x25d0 0x23b5)
terminate called throwing an exception%

理论上,您应该能够直接将 lambda 作为参数嵌套,而不是先将其分配给变量,但我认为 RubyMotion 无法正确保留该 block ,如果您尝试这样做,应用程序会在没有错误的情况下崩溃。

关于ios - 从 Rubymotion 调用 NSSetUncaughtExceptionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12372234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com