Unity手游崩溃异常如何捕获--C#及JVM捕获

1 C#脚本异常捕获

C#脚本未捕获的异常,与Android和Native未捕获异常很大的区别是,未捕获异常不会照成引用的闪退。所以,C#脚本的异常危害相对较小,但是同样更加容易存在在游戏中。闪退问题能够及时发现并进行修复。C#脚本异常,抛出的时机不同,危害性也有所不同; 在Start、Awake等函数抛出的异常,会造成Update、OnGUI无法正常运行,游戏可能表现为无响应、图片确实等。Update、OnGUI的异常也一定会引起游戏逻辑及画面上的一些异常。

从测试角度,C#脚本未捕获的异常时一定需要报告给开发者的。

1.1 AppDomain.CurrentDomain.UnhandledException回调

这几乎是所有语言都会提供的一个机制,在发生未捕获异常时回调。System.AppDomain在Unity的文档中是不存在的,根据微软官网的解释,CurrentDomain获取到当前应用程序当前线程的应用域。

If the UnhandledException event is handled in the default application domain, it is raised there for any unhandled exception in any thread, no matter what application domain the thread started in.

如果是在默认域中注册,任何线程中抛出的未捕获异常均会触发这个未处理异常函数。

然后,在游戏里面,尝试在其他线程抛出异常。

但是,抛出异常后并没有被这个处理函数接收到。

在UI线程中,Unity官方提供的函数基本上都会有try..catch,所以很难有出现未捕获的异常。比如,我们尝试通过下面的代码抛出未捕获异常

GameObject.SendMessage显然是接住了这个异常,并打印出了这个异常信息。所以,UnhandledException大部分时候将会非常鸡肋,并没什么卵用。

1.2 Application.RegisterLogCallback日志回调

根据日志的TAG都会Unity,可以大致判断出UnityEngine自身的接口,在catch异常之后也是会调用Debug.LogError来输出日志的。所以,我们可以通过注册RegisterLogCallBack来获取到系统的调用。

但是,在OnLogCallbackHandler,是不能够调用Debug.Log,Debug.LogError这个API的,调用都会无效。Unity可能是为了避免引起,不必要的无限递归,所以在该函数下禁用Debug.Log。我们可以通过AndroidJavaClass调用Java代码来输出日志。

这样就能顺利的输出,未捕获的异常信息了。

2 Java未捕获异常

Android在Thread中提供了setUncaughtExceptionHandler和setDefaultUncaughtExceptionHandler,setUncaughtExceptionHandler函数只对应注册的线程中起作用,setDefaultUncaughtExceptionHandler能够在所有线程中都有用。所以,我们要监听Jvm层抛出的未捕获异常,可以直接注册DefaultUncaughtExceptionHandler。

默认的未捕获处理函数,在接到异常之后,最后会把进程杀死。如果,不杀死会照成无响应bug。

在代码中增加上述,检测程序后,即可输出如下的日志结果。

►欢迎小伙伴们与我们多交流沟通,我们会收集大家的意见,不断优化完善,提供更优质的服务!

原文发布于微信公众号 - 腾讯WeTest(TencentWeTest)

原文发表时间:2015-10-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏進无尽的文章

load方法简化类的负载、结构化工程

这篇文章即是技术篇又是跟项目架构设计相关的文章,(个人是这样感觉的),一直在搜集和总结产品架构方面的技术和技巧,很多时候都是自己知道,但是不知道怎么写出来,恰好...

9130
来自专栏嵌入式程序猿

教你MODBUS程序符合MISRA规则

做嵌入式开发的广大工程师应该对MISRA C不陌生,他是Motor Industry Software Reliability Association 的缩写,...

17230
来自专栏Java职业技术分享

使用Python这么多年,才发现Python还有这些实用的功能和特点

在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性。一些可以说是非常有用,但却没有充分利用。考虑到这一点,我编辑了一些你应该了解的Pytho...

16630
来自专栏北京马哥教育

原来 Python 还有这些实用的功能和特点!

在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性。一些可以说是非常有用,但却没有充分利用。考虑到这一点,我编辑了一些你应该了解的Pytho...

14420
来自专栏向治洪

Android热修复技术总结

插件化和热修复技术是Android开发中比较高级的知识点,是中级开发人员通向高级开发中必须掌握的技能,插件化的知识可以查我我之前的介绍:Android插件化。本...

39870
来自专栏PPV课数据科学社区

适用于 PHP 开发人员的 Python 基础知识

您是一名 PHP 开发人员。您在过去 五年(或更长时间)中可能一直都编写应用程序,您已经将许多想像变成了可能 — 电子商务系统、简单内容管理系统、Twitte...

425150
来自专栏日常学python

为什么 Python 这么慢?

对于一个类似的程序,Python 要比其它语言慢 2 到 10 倍不等,这其中的原因是什么?又有没有改善的方法呢?

20820
来自专栏玉树芝兰

如何让Jupyter Notebook支持多种编程语言?

不满意Jupyter Notebook只有Python 2环境,还打算让它支持Python 3与R?没问题,本文一步步帮助你实现这个愿望。

27210
来自专栏Java帮帮-微信公众号-技术文章全总结

【大牛经验】关于堆和栈的那些事

问题描述 编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。...

37790
来自专栏美团技术团队

Android插件化、热补丁中绕不开的ProGuard的坑

26360

扫码关注云+社区

领取腾讯云代金券