2013 年 3 月 13 日
星期三常见问题解答:运行时错误监听器
现在是星期三,又到了常见问题解答环节。以下是一些关于新的运行时错误处理程序和 Android 权限的常见问题(FAQ)。
1. 当前每日构建版本上的运行时错误消息弹出窗口是怎么回事?
从 Android 上的 Build 1030 和所有其他平台上的 Build 1047 开始,运行时错误现在会生成一个弹出消息框,显示错误以及文件和行号(如果是调试版本)。错误信息仍然显示在控制台中,但您无需打开控制台/终端窗口即可知道发生了错误。从 Build 1047 开始,您可以在代码中包含运行时监听器来捕获错误并抑制运行时弹出消息(如果需要)。
运行时消息框默认在所有平台上出现,包括 Mac 和 Windows 模拟器。
2. 如何实现 Lua 运行时错误监听器?
以下代码演示了如何实现运行时监听器(“unhandledError”)。如果在 Corona 模拟器或设备上运行代码,您将看到由于在 print 语句中将 nil 值与字符串连接而导致的错误。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
local releaseBuild = true -- 设置为 true 以抑制弹出消息 -- 错误处理程序 local function myUnhandledErrorListener( event ) if releaseBuild then print( "正在处理未处理的错误 >>>\n", event.errorMessage ) display.newText( ">>> 发生错误 <<<", 30, 1, native.systemFont, 18 ) else print( "未处理未处理的错误 >>>\n", event.errorMessage ) end return releaseBuild end Runtime:addEventListener("unhandledError", myUnhandledErrorListener) -- 在屏幕中心显示文本消息 txtMsg1 = display.newText( "运行时错误测试代码", 55, 200, "Verdana-Bold", 14 ) print( "ABC" .. nil ) -- <<<< 此处 Lua 错误 |
如果您从监听器返回 false(默认值),则当监听器函数退出时会弹出消息框。返回 true 表示监听器函数处理了运行时错误,并且弹出消息被抑制。在上面的代码中,releaseBuild 变量确定是否显示弹出消息。
3. 运行时错误监听器的最佳实践是什么?
添加运行时弹出消息和运行时错误监听器的目的是为开发人员提供更多工具来运行代码并跟踪错误。如果您构建用于调试(在 iOS 上使用开发人员模式或在 Android 上使用 debug 键),则任何运行时错误都包括发生错误的文件名和行号。它还包括有关错误的消息。通常,此信息包含在弹出消息框中。如果您添加运行时监听器并抑制弹出窗口,您仍然可以通过传递给监听器的事件表和控制台/终端访问错误信息。
在生产版本中,仅提供错误类型。您可以实现运行时监听器并使用它来抑制错误弹出并记录内部错误。您如何处理此错误日志取决于您。您可以忽略它或创建一个日志文件,该文件将发送到您自己的服务器以跟踪问题。允许弹出错误发生的一个优点是,它会将信息发送回 Google Play,从而使开发人员可以获得该信息。如果您抑制弹出窗口,除非您记录并将其发送到您自己的服务器,否则信息将丢失。
您可能希望在调试和测试阶段允许运行时弹出窗口,并在将应用程序交付到应用商店时抑制弹出窗口。
我在以前的常见问题解答中提到过,忽略错误不是最佳实践。运行时错误会改变代码路径,并可能导致应用程序变得不稳定。您应该始终在尽可能多的设备上测试您的应用程序,并消除或捕获(使用 pcall)发现的任何错误。
4. 我正在使用运行时监听器,但我仍然收到运行时错误弹出窗口。
如果您在代码中实现了抑制错误弹出窗口的运行时错误监听器,但仍然收到弹出窗口,则可能是运行时监听器启动之前发生了错误。如上面的示例代码所示,运行时监听器函数是代码中定义的第一个内容。关键是尽快启用运行时监听器,以便它可以捕获错误。在启用运行时错误监听器之前发生的错误会生成弹出消息。通常,启动时发生的错误很容易修复,不需要捕获。如果要抑制向用户显示的弹出消息,则在应用程序运行时发生的触摸事件、碰撞等引起的运行时错误才是需要捕获的重要错误。
5. Android 权限和运行时错误是怎么回事?
在 Build 1030 中,我们删除了 Android Manifest 中的默认权限,因此您现在负责为需要它们的 API 添加回权限。所有每日构建示例代码项目和 API 页面都已更新,以在 build.settings 文件中显示所需的权限。
通常,缺少权限会生成运行时错误,要么通过运行时弹出窗口,要么通过调用运行时“unHandledError”监听器(如果已实现)。缺少权限是应该在发布应用程序之前进行测试和捕获的内容(请参阅问题 6)。
6. 哪些 Android 权限不会生成运行时错误?
如果未在 build.settings 文件中设置正确的权限,则某些 API 调用将静默失败。它们是
- display.capture
- display.captureBoard
- display.captureScreen
- media.newRecording
- media.newVideo
- media.save
- media.show
- native.webView
- native.newWebPopup
- heading(罗盘)事件
- location (GPS) 事件
对于上面列出的 API,您需要检查结果以验证代码是否按预期工作。最好仔细检查是否为这些 API 在 build.settings 文件中设置了正确的权限。对于未来的构建,我们正在考虑为所有 API 添加运行时检查,以确保它们都设置了正确的权限。
查看每日构建文档,了解每个 API 所需的正确 Android 权限。
今天的答案就到这里。我希望您喜欢它们,甚至学到了一些东西!
抱歉,评论表单目前已关闭。