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が発生すると、ハンドラメソッドも呼び出されません。シミュレーターとデバイスの両方で試しましたが、成功しませんでした。
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