似乎没有办法访问在通用用户的非调试版Flash上运行的Flex应用程序的已发布版本的堆栈跟踪。我仍然可以访问错误号,但在某些情况下这还不够好。
想知道是否有人有任何提示如何处理这个问题。我能想到的是在一些缓冲区中记录尽可能多的事件,然后在发生崩溃时将其转储到服务器。我已经实现了这个并且没关系,但不幸的是,如果您的代码库相当广泛,那么在整个地方添加日志记录似乎并不实用。但也许有一种方法可以用一些我没想过的简单方式来记录各种各样的东西 - 某种集中式的监听器?或者也许是其他方法?
会接受任何建议(尽管理想情况下会跳过“你应该在发布之前测试你的应用程序”吗?)。
谢谢你!答案 0 :(得分:3)
不幸的是,目前你不能做很多事情。显而易见的起点当然是试图让用户在Flash Player的调试版上运行该程序。但是,如果你不能,并且你需要找到一种以“全能”方式“内置”运行时错误检测的方法,那么我只能想到两种即时补救方法:
在应用程序的关键点插入默认日志消息。这应该处于更高的抽象级别,可能在创建或删除模块或启动和完成复杂任务时。理想情况下,日志记录也应该是可配置的,以便您可以在需要时打开或关闭详细输出,例如:通过更改配置文件或在编译期间设置环境变量 - 调试代码可能会使应用程序运行速度变慢,并且您不希望每次遇到错误时都必须添加和删除单个跟踪语句。如果您是高级ActionScript开发人员,您甚至可能希望找到一种方法来实现通过元数据和/或自定义命名空间进行日志记录 - 这是一种更清晰的方法。
将catch-all approach应用于整个应用程序,并跟踪堆栈中的每个错误。也许这可能没有你已经拥有的那么明确,但至少你可以干净地关闭程序(例如,向用户显示一条消息)而不是让它崩溃。
遗憾的是,你已经创建了一个程序,其中“不要告诉我在发布之前测试”的态度 - 回想起来你可以做的事情并不多,除了启动调试器和加一些额外的时间。实际上,你应该在编写之前对每一行代码进行测试 ...但我不会深入研究 - TDD通常需要更多的解释而不是一个答案。
以下是一些简单的事情,可以让您的生活更轻松:
人们通常犯的最大错误就是不要让错误发生在第一位:例如,如果你的应用程序代码中有很多null
- 检查:
if (myVar != null) doMyStuff(); // or
if (myVar == null) return;
这通常用于防止可怕的#1009错误显示,它相对有效,乍一看它比使用try...catch
块更快。但是它也会模糊问题的根源,甚至让它不被注意:您的错误可能会在稍后出现,其他内容应该在doMyStuff()
初始化,或者可能有些地方你根本忘记检查。
无差错的最佳策略是:
永远不会返回或分配非法值(例如,不允许函数返回null
,为所有变量分配初始值等。)
在应用程序的关键点实施try...catch
块(基本上每当出现问题时)。然后,这些会在发现错误时发送详细的日志消息,因此您可以轻松发现原因,而无需使用冗长的调试会话。
创建自我验证对象。我喜欢使用verify()
方法,在初始化对象或将其添加到舞台之前调用该方法,检查所有必需的依赖项 - 如果缺少任何内容或具有错误的值,则抛出InstantiationException
。
答案 1 :(得分:0)
我为一个简单的项目尝试了一次:我编写了一个脚本,它解析了源代码并插入了一些代码,这些代码在进入函数时会将函数名和参数写入堆栈,并在退出时弹出名称来自堆栈的参数。
在某些情况下,这不足以或很难做到:
如果你在代码中抛出并捕获错误(我从来没有这样做,所以这对我来说永远不是问题),那么你需要一些额外的功能来从堆栈中弹出很多元素,一旦出现错误被抓了。
我总是以某种方式编写代码,函数的最后一行和最后一行从函数返回,所以我很容易找到我应该弹出一个元素的所有地方从堆栈 - 但您可能需要更精细的算法。
AS3具有极其复杂的语法,因此编写100%正确的预处理器是一项非常繁琐的工作。我已经接受预处理器如果与E4X一起使用会产生错误的代码,如果是这样的话,必须手工修复它。
答案 2 :(得分:0)
我按照weltraumpirat的回答添加一些“最佳实践”。实现另一个只包含字符串数组的记录器。您应该在应用程序的大多数部分中使用日志记录。通过这种方式,您可以拥有类似人工堆栈跟踪的功能。通过在启动时加载配置xml或其他内容,使内存调试器的日志级别可通过Web服务器进行控制。添加全局错误和错误处理程序并将它们集中在一起。用ie构建一个错误值对象。玩家能力,艺术。堆栈跟踪,组织。错误消息等,并尝试通过远程调用将其发送到服务器。