JavaScript错误处理的最佳实践是什么?
我希望开始让我的JavaScript更加防错,我发现了大量关于使用JavaScript错误处理的最佳实践是什么?,javascript,error-handling,Javascript,Error Handling,我希望开始让我的JavaScript更加防错,我发现了大量关于使用try、catch、finally和throw的文档,但我没有从专家那里找到大量关于何时何地抛出错误的建议 是否应该将每一段代码都包装在一个try/catch中 有没有更多的建议,比如在什么时候应该发现错误 在生产中引发错误而不是让代码无声地失败是否有缺点 就实现而言,这已经涉及到了,但是服务器记录JS错误是一种有效的策略吗 关于在应用程序中捕获错误,还有什么我应该知道的吗 我也完全喜欢听那些有很棒的章节或深入解释错误处理的书
try
、catch
、finally
和throw
的文档,但我没有从专家那里找到大量关于何时何地抛出错误的建议
- 是否应该将每一段代码都包装在一个try/catch中
- 有没有更多的建议,比如在什么时候应该发现错误
- 在生产中引发错误而不是让代码无声地失败是否有缺点
- 就实现而言,这已经涉及到了,但是服务器记录JS错误是一种有效的策略吗
- 关于在应用程序中捕获错误,还有什么我应该知道的吗
谢谢你给我的建议 IHMO,您应该像在其他几种语言(AFAIK:Python,Java)中一样,在javascript中使用错误处理 为了获得更好的可读性(以及可能更好的性能,尽管我不确定它是否有很大的影响),您应该在以下情况下主要使用try/catch块:
- 要包装的代码部分是整个算法的键部分。如果失败,它可以:
- 在代码的下一部分上创建错误(例如,因为缺少var…)
- 使页面看起来不符合预期(对内容或css的影响)
- 使结果对用户来说显得陌生(对代码行为的影响)
- 您知道您正在编写的代码与每个浏览器都不兼容
- 您计划代码可能会失败(因为没有其他方法可以通过if…then…块来检查它是否正常工作)
- 而且当您想调试而不打扰最终用户时
Max关于企业JavaScript错误处理的一组非常有趣的幻灯片可以在 简言之,它总结了:
雅虎的尼古拉斯·扎卡斯!fame在Ajax Experience 2008上做了一次关于企业错误处理()的演讲,他在演讲中提出了如下建议:
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发布了一篇文章,其中包括一个聪明的模式,可以在生产环境中自动注入错误处理代码(使用面向方面的编程)
当您开始记录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);
}
处理无用的
窗口。未定义中的错误:0
错误取决于您的站点体系结构,但可以尝试识别所有Ajax调用,并在出现故障时引发异常(可能使用返回堆栈跟踪)
比如stacktrace(errorObject.stack)、文件名、行号和列号。
请注意,每个浏览器都有一些差异…所以请尽最大努力获得好的错误
甚至可能会有问题。
我使用和一个特殊函数来跟踪任何给定的标准错误对象
另一个优点是将web应用程序的版本包含在stacktrace附近的某个位置(用于快速、安全的复制和粘贴)。在开发模式下,您可能会更主动地显示错误(警报…),因为开发人员不会经常监视浏览器控制台,并且可能看不到某些问题
还可以使用避免使用抛出“我的消息”
,使用抛出新错误(“我的消息”)
,您甚至可以有自定义错误,请阅读
始终为错误添加一些上下文(版本、对象id、一些自定义消息等),并确保区分外部错误(导致系统失败的某些外部数据或环境)和内部错误/断言(您自己的系统出错),请阅读关于“”
这是一本书
还可以考虑在LIB和框架中使用诸如拦截器之类的常规错误处理:
- 及
- 你的新摄影框架在这里
- 我为此创建了脚本。它会阻止除允许列表中提到的项目之外的所有控制台命令,或者阻止blocklist中的所有内容。即使是彩色控制台日志也能正常工作
这当然取决于如果出现问题,您的失败程度以及可能出现的错误消息的数量。您不想失败,因为您的错误日志记录目录已满,是吗?-你看过这里吗@mplungjan-我确实浏览了那里的答案,但似乎没有多少是规范的,搜索Javascript错误处理/异常最佳实践没有发现任何结果,因此我认为尝试收集一些浓缩的想法可能会有所帮助,无论是对我自己的理解还是对未来的搜索者。也许这是