我希望开始使我的JavaScript更加错误验证,并且我找到了大量有关使用try
,catch
,finally
和{{1}的文档但是,我没有从专家那里找到关于何时何地抛出错误的大量建议。
我也完全是因为听过有很多章节或对错误处理的深入解释的书籍而玩游戏。 Eloquent JavaScript触及此事,但对此问题并不是非常规范或自以为是。
感谢您提供任何建议!
答案 0 :(得分:57)
可以在http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/找到关于企业JavaScript错误处理的一组非常有趣的幻灯片
总之,它总结了:
幻灯片更详细,很可能会给你一些方向。
更新
上面提到的演示文稿可以在这里找到: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation
答案 1 :(得分:30)
Yahoo!的Nicholas Zakas成名在Ajax Experience 2008上讨论了企业错误处理(slides),他提出了类似的建议:
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;
}
一年后,Nicholas Zakas发布了一个update on his blog,其中包含一个聪明的模式,可以在您的生产环境中自动注入错误处理代码(使用面向方面的编程)。
当你开始记录window.error调用时,你会注意到两件事:
减少日志条目的洪流就像在登录服务器之前测试严重性和/或随机数一样简单:
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);
}
处理无用的“window.error in undefined:0”错误取决于您的站点体系结构,但可以尝试识别所有Ajax调用并在出现故障时抛出异常(可能使用stacktrace.js返回堆栈跟踪)。
答案 2 :(得分:7)
IHMO,您应该像在其他几种语言中一样使用javascript中的错误处理(AFAIK:Python,Java)。
为了更好的可读性(可能性能更好,即使我不确定它会产生很大的影响),您应该在以下情况下使用try / catch块:
要包装的代码部分是整个算法的关键部分。如果失败,它可以:
您知道您撰写的代码与每个浏览器不兼容
最终,javascript专家可能会提供其他元素。
我的2美分,
此致
最高
答案 3 :(得分:4)
除了其他答案之外:一个重要的事情是使用JavaScript错误对象和window.onerror
函数参数中提供的上下文数据。
类似stacktrace(errorObject.stack),文件名,行号和列号。 请注意,每个浏览器都有一些差异......所以尽力避免错误。
console object itself甚至可能出现问题。 我使用a custom window.onerror function inspired by this one和一个特殊函数来跟踪受this code启发的任何给定标准错误对象。
另一个好处是将Web应用程序的版本包含在靠近堆栈跟踪的位置(用于快速安全的复制和粘贴)。您可能还会在开发模式下更积极地显示错误(警告...),因为开发人员不会经常监视浏览器控制台,也可能看不到某些问题。
另外使用避免使用throw 'My message'
,使用throw new Error('My message')
,您甚至可以有自定义错误,请阅读this article。
总是在错误中添加一些上下文(版本,对象的ID,一些自定义消息,......),并确保区分外部错误(某些外部数据或强制导致系统失败)和内部错误/断言(你自己的系统搞砸了),阅读' Design by contract'。
这是guide。
还要考虑使用像libs和frameworks这样的拦截器进行常规错误处理:
答案 4 :(得分:0)
我为此创建了脚本。它会阻止所有控制台命令(允许列表中提到的项目除外),或阻止所有内容。即使使用彩色控制台日志也能很好地工作。