`
ch_kexin
  • 浏览: 897550 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

线上发行版捕获全局异常日志的方法

 
阅读更多

最近游戏快上线了。老板提了个需求。希望我们能把客户端的报错都记录下来,并存到服务器日志里。有很多线上的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);
        }
    }
}

运行结果:
ErrorTest

ErrorTest2

 

这里要注意下,测试的时候要导出发行版,然后用非Debug版本的FP去运行,Debug版本的FP设不设置swf-version=18,都能成功获得堆栈信息。

附上完整的测试项目:ErrorTest

分享到:
评论

相关推荐

    Android捕获全局异常并写日志保存到sd卡.rar

    Android捕获全局异常并写日志保存到sd卡,捕获异常消息后输出这个消息,可避免APP强制退出,抛出NullPointException玩玩哈,捕获全局异常是因为有的异常我们捕获不到,捕获时我们采用同步方法,以免单例多线程环境下...

    利用springmvc切面捕获全局异常入库源码

    "利用SpringMVC切面捕获全局异常入库源码"这个项目正是为了实现这样的功能,即通过面向切面编程(AOP)的方式捕获并记录全局异常,然后将这些异常信息存储到数据库中。下面我们将详细探讨相关的知识点。 首先,让...

    捕获全局异常UnException

    android在产品上线以后为了能够实时捕获异常,需要写一个异常捕获的类,这个类在你遇到异常的时候会执行uncaughtException这个方法,然后你就可以对异常进行一些操作。

    捕获全局异常.rar

    全局异常捕获就是一种机制,它允许开发者统一处理应用程序中的所有未被捕获异常,无论是主线程还是子线程。本教程将深入探讨如何在Android中实现全局异常捕获。 首先,我们来看`CrashHandler.java`这个文件。这是一...

    Android捕获全局异常信息替换系统错误

    为了解决这个问题,开发者通常会选择捕获全局异常信息,以便更优雅地处理错误,同时向用户提供有意义的反馈。本文将深入探讨如何在Android中实现全局异常捕获,以及如何使用系统级对话框显示这些异常信息。 首先,...

    android全局异常捕获 exception_global

    在Android开发中,全局异常捕获是一个至关重要的实践,它能确保应用在遇到未预期的错误时仍能保持稳定,并提供良好的用户体验。标题"android全局异常捕获 exception_global"和描述都指向了这个主题,表明我们将探讨...

    vb.net全局错误全局异常处理捕获

    全局异常处理允许开发者集中处理可能出现的错误,而不是在每个函数或方法中单独设置异常处理代码。本篇文章将深入探讨如何在VB.NET中实现全局错误捕获。 首先,我们要了解VB.NET中的异常处理机制。当程序运行过程中...

    JAVA 自定义异常 全局捕获

    自己编写异常类型 ,自定义错误异常进行全局捕捉。实现项目全局的拦截定义输出。。。

    Android 全局异常捕获

    // 这里可以对捕获到的异常进行日志记录,或者发送错误报告等操作 Log.e("GlobalExceptionHandler", "Uncaught Exception: ", ex); // 如果不想让应用立即崩溃,可以在这里进行一些错误处理或恢复操作 // 如果...

    dubbo捕获自定义异常_dubbo异常捕获_dubbo异常_自定义异常_捕捉异常_

    本文将深入探讨如何在 Dubbo 中捕获自定义异常,以及相关的最佳实践。 1. **自定义异常类** 在 Java 中,自定义异常通常继承自 `Exception` 或其子类。例如,你可以创建一个名为 `CustomServiceException` 的异常...

    安卓日志分析崩溃拦截相关-Android捕获全局异常源码.rar

    这个压缩包“Android捕获全局异常源码”可能包含了以上提到的一些实现,你可以尝试解压并研究其中的代码,学习如何在Android应用中有效地捕获异常和分析日志。注意,由于作者提到部分代码可能不可用,所以在实际使用...

    android捕获全局异常,CrashHandler完整工程源码

    为了提高应用的质量,开发者通常会采用捕获全局异常的方式来监控和处理这些异常。本篇将详细介绍如何在Android中实现全局异常捕获,并提供一个名为"CrashHandler"的完整工程源码。 首先,我们需要了解Android中的...

    android全局异常捕获

    此外,除了捕获全局异常,开发者还可以结合使用`try-catch`语句块对特定代码段进行异常处理,以提供更精确的控制。同时,为了提高应用的健壮性,应尽量避免在代码中抛出未捕获的异常,而是在可能出现错误的地方提前...

    捕获全局异常

    捕获全局异常

    c#全局异常捕获

    c#全局异常捕获 捕获全局异常,抛出异常显示,也可以自己制作个日志类 记录异常信息

    node.js express捕获全局异常的三种方法实例分析

    本篇文章将详细讲解三种捕获全局异常的方法,并通过实例分析其使用场景和注意事项。 ### 方法一:`process.on('uncaughtException')` `process.on('uncaughtException')` 是Node.js内置的事件监听器,用于捕获那些...

    WPF全局异常捕获Demo,防止程序运行过程中出现异常崩溃

    本示例"**WPF全局异常捕获Demo**"旨在提供一种策略,确保在程序运行过程中能够有效地捕获和处理异常,从而防止程序因错误而意外终止。 首先,我们要理解WPF应用程序的生命周期,以及在何处设置全局异常处理。WPF...

    WPF程序全局异常捕获示例

    以上就是WPF应用程序全局异常捕获的基本方法。通过正确处理UI线程、Task任务以及非UI线程的异常,可以显著提高应用的稳定性和用户体验。在实际项目中,除了显示错误信息,你还可以选择记录日志、发送错误报告或者...

    Android例子源码捕获应用全局异常避免强制退出并写出日志到sd卡

    Android例子源码捕获应用全局异常避免强制退出并写出日志到sd卡

    一个WPF的全局异常捕获写法

    一个可以捕获全局异常的方法,省去在代码中进行异常方法的添加,并且直接输出日志

Global site tag (gtag.js) - Google Analytics