What are the best practices for JavaScript error handling?
我想让我的javascript更具防错性,我发现了很多关于使用
- 每段代码都应该包装在一个try/catch中吗?
- 关于什么时候应该发现错误,还有更多这样的建议吗?
- 在生产中,是否存在引发错误而不是让代码安静地失败的缺点?
- 就实现而言,这已经被提到了,但是服务器记录JS错误是否是一种有效的策略?
- 关于在我的应用程序中捕获错误,还有什么我应该知道的吗?
我也完全是一个游戏,听那些有伟大的章节或深入的错误处理解释的书。雄辩的javascript涉及到这一问题,但并不是很规范或对这一问题有意见。
谢谢你的建议!
在http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices上可以找到一组非常有趣的关于企业javascript错误处理的幻灯片。/
简而言之,它总结了:
幻灯片将更详细地介绍,很可能会给您一些指导。
更新
上面提到的演示可以在这里找到:http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation
雅虎的尼古拉斯·扎卡斯!Fame在Ajax Experience 2008上做了一次关于企业错误处理(幻灯片)的演讲,他在演讲中提出了如下建议:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function log(sev,msg) { var img = new Image(); img.src ="log.php?sev=" + encodeURIComponent(sev) + "&msg=" + encodeURIComponent(msg); } // usage log(1,"Something bad happened.") // Auto-log uncaught JS errors window.onerror = function(msg, url, line) { log(1, msg); return true; } |
一年后,NicholasZakas在他的博客上发布了一个更新,其中包括一个聪明的模式,可以在生产环境中自动注入错误处理代码(使用面向方面的编程)。
当您开始记录window.error调用时,您将注意到两件事:
减少日志条目的洪流与在登录到服务器之前测试严重性和/或随机数一样简单:
1 2 3 4 5 6 7 8 | function log(sev,msg) { if (Math.random() > 0.1) return; // only log some errors var img = new Image(); img.src ="log.php?sev=" + encodeURIComponent(sev) + "&msg=" + encodeURIComponent(msg); } |
在未定义的0中处理无用的"window.error"错误取决于您的站点体系结构,但可以尝试识别所有Ajax调用,并在发生故障时引发异常(可能使用stack trace.js返回堆栈跟踪)。
IHMO,你应该使用JavaScript中的错误处理,就像你用其他几种语言(AFAIK:Python,Java)一样。
为了获得更好的可读性(可能还有更好的性能,尽管我不确定它是否有真正的巨大影响),您应该在以下情况下使用try/catch块:
要包装的代码部分是整个算法的关键部分。如果失败,它可以:
- 在代码的下一部分创建错误(例如,因为缺少var…)
- 使页面不符合预期(对内容或CSS的影响)
- 使结果对用户来说显得奇怪(对代码行为的影响)
您知道您正在编写的代码与每个浏览器都不兼容
- 您计划了代码可能会失败(因为没有其他方法可以检查它是否应该通过if…then…方块)
- 而且,当您希望在不干扰最终用户的情况下进行调试时
最终,JavaScript专家可能会提供其他元素。
我的2美分到盒子里,
当做,
马克斯
除其他答案外:一个重要的事情是使用javascript错误对象和
例如stacktrace(errorobject.stack)、文件名、行号和列号。请注意,每个浏览器都有一些不同之处……所以请尽最大努力获得好的错误。
甚至控制台对象本身也可能有问题。我使用一个受此函数启发的自定义window.onerror函数和一个特殊函数来跟踪任何受此代码启发的给定标准错误对象。
另一个好的地方是在stacktrace附近包含Web应用程序的版本(为了快速、安全地复制和粘贴)。在开发模式中,您还可能更积极地显示错误(警报…),因为开发人员不会经常监视浏览器控制台,也可能看不到某些问题。
还可以使用避免使用
始终在错误中添加一些上下文(版本、对象的ID、一些自定义消息等),并确保区分外部错误(某些外部数据或强制导致系统失败)和内部错误/断言(您自己的系统混乱),阅读"按合同设计"。
这是导游。
还可以考虑使用常规的错误处理,比如拦截器、lib和框架:
- JQuery
- 角度1.x和HTTP
- 角2
- 你的新毒品框架…