最近游戏快上线了。老板提了个需求。希望我们能把客户端的报错都记录下来,并存到服务器日志里。有很多线上的bug,在本地很难重现,如果能记录下来报错地方的调用堆栈。对调试就会很有帮助。也可以更加准确地分析出用户的留存率是否跟某个bug有关系,从而及时修复。
查了下API,loaderInfo有个uncaughtErrorEvents的属性,可以在上面监听到全局未处理(没有在try…catch里)的异常。这个接口是FP10.1开始提供的。现在FP一般都是11以上了。所以应该没问题。写了下代码,测试成功。可是遇到个问题,没法获取异常触发地点的调用堆栈。因为Error.getStackTrace()方法(FP9已经提供)被限制在Debug版本中使用。后来经高人指点,FP11.5以上版本又开放了这个接口,可以在非Debug版FP中调用了。据最新的统计数据显示,FP11的覆盖率应该已经达到80%以上,而且FP11以后都有静默升级。也就是说大部分用户都是在11.5以上版本的。写这个功能也只是做辅助的调试日志用,有这个覆盖率应该足够了。不过,要开启这个接口,必须在编译时加上编译参数-swf-version=18,否则,即使客户端FP版本够高也不会为你的SWF文件开启这个接口。经过反复测试。增加-swf-version=18并不会导致SWF不能在低版本的FP上运行。所以是兼容的。
以下是测试代码:
ErrorTest.as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
package { import flash.display.Sprite;
import flash.events.ErrorEvent;
import flash.events.UncaughtErrorEvent;
import flash.text.TextField;
import flash.utils.setTimeout;
import org.domlib.test.ErrorDispatcher;
/**
* 全局异常捕获测试
* @author DOM
*/
public class ErrorTest extends Sprite
{
public function ErrorTest()
{
loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,unCaughtErrorHandler);
logText.width = logText.height = 1000 ;
addChild(logText);
setTimeout(runTest, 20 );
}
private var logText:TextField = new TextField();
private function runTest(): void
{
try
{
new ErrorDispatcher( "在try...catch里的错误" ); //在try...catch里的错误不会触发事件。
}
catch (e:Error){}
new ErrorDispatcher( "不在try...catch里的错误" ); //这个错误会触发。
}
private function unCaughtErrorHandler(event:UncaughtErrorEvent): void
{
var message: String = "" ;
if (event.error is Error)
{
//只有FP11.5以上才能在非debug版本中调用getStackTrace()。
message = Error(event.error).getStackTrace();
if (!message)
message = Error(event.error).message;
}
else if (event.error is ErrorEvent)
{
message = ErrorEvent(event.error).text;
}
else
{
message = event.error.toString();
}
logText.appendText(message);
}
}
} |
ErrorDispatcher.as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package org.domlib.test
{ /**
* 错误抛出者
* @author DOM
*/
public class ErrorDispatcher
{
public function ErrorDispatcher(message: String )
{
throw new Error(message);
}
}
} |
这里要注意下,测试的时候要导出发行版,然后用非Debug版本的FP去运行,Debug版本的FP设不设置swf-version=18,都能成功获得堆栈信息。
附上完整的测试项目:ErrorTest
相关推荐
Android捕获全局异常并写日志保存到sd卡,捕获异常消息后输出这个消息,可避免APP强制退出,抛出NullPointException玩玩哈,捕获全局异常是因为有的异常我们捕获不到,捕获时我们采用同步方法,以免单例多线程环境下...
android在产品上线以后为了能够实时捕获异常,需要写一个异常捕获的类,这个类在你遇到异常的时候会执行uncaughtException这个方法,然后你就可以对异常进行一些操作。
本资源文件是利用SpringMVC面向切面实现的一套捕获全局异常插入数据库的代码,刚开始想实现HandlerExceptionResolver,但是不知道为什么不起作用,又自己重新写了一套。
Android中捕获全局异常信息,并使用系统级对话框显示
自己编写异常类型 ,自定义错误异常进行全局捕捉。实现项目全局的拦截定义输出。。。
安卓全局异常捕获
.net 中捕获全局异常,包括winfrom,wpf和web三种winform 主流开发
springboot全局捕获异常springboot全局捕获异常springboot全局捕获异常
实现UncaughtExceptionHandler拦截android异常,捕获全局异常,CrashHandler完整工程源码
捕获全局异常
WPF全局异常捕获Demo,防止程序运行过程中出现异常崩溃
vb.net全局错误全局异常处理捕获,调用非常简单,再也不用担心意外错误!
Android例子源码捕获应用全局异常避免强制退出并写出日志到sd卡
主要介绍了node.js express捕获全局异常的三种方法,结合实例形式简单分析了node.js express捕获全局异常的常见操作方法与使用注意事项,需要的朋友可以参考下
解决dubbo接口自定义异常的捕捉问题,dubbo消费者可以捕捉到提供者所抛出的自定义异常。
一个可以捕获全局异常的方法,省去在代码中进行异常方法的添加,并且直接输出日志
Android捕获全局异常将错误信息发送到邮件,很好用的
android全局异常捕获 exception_global
Android全局捕获崩溃异常记录日志保存至本地并定时删除
Android 捕获全局异常处理,崩溃前弹出提示框,错误信息保存至本地文件或发送邮件,或上传至后台服务器。