JavaScript 错误处理的最佳实践是什么?

我希望开始让我的 JavaScript 更加防错,我找到了大量关于使用 trycatchfinallythrow的文档,但是我没有找到大量关于何时何地抛出错误的专家建议。

  • 每段代码都应该包装在 try/catch 中吗?
  • 是否有更多像 穿上这个这样的建议,在什么时候应该捕捉错误?
  • 在生产环境中引发错误而不是让代码无声无息地失败有什么缺点吗?
  • 就实现而言,这已经涉及到了 SO,但是服务器日志 JS 错误是否是一种有效的策略呢?
  • 关于应用程序中的陷阱错误,还有什么是我应该知道的吗?

我也完全乐于听到有伟大的章节或错误处理的深入解释的书籍。雄辩的 JavaScript触及到了这个问题,但是对这个问题并没有很强的规定性或者固执己见。

谢谢你给我的任何建议!

63319 次浏览

IHMO,您应该像在其他几种语言(AFAIK: Python,Java)中那样在 javascript 中使用错误处理。

为了获得更好的可读性(或许还有更好的性能,尽管我不确定它是否真的有很大的影响) ,您应该主要在以下情况下使用 try/catch 块:

  • 要包装的代码部分是一个键 算法的一部分。如果失败,它可以:

    • 在代码的下一部分创建错误(例如,因为缺少一个 var...)
    • 使页面看起来不符合预期(对内容或 css 的影响)
    • 使结果对用户来说显得奇怪(对代码行为的影响)
  • 您知道您正在编写的代码是 不兼容所有浏览器

  • 您计划使用 代码可能会失败(因为没有其他方法检查它是否应该通过 if... then... block 工作)
  • 而且当你想 调试而不打扰最终用户时

最终,javascript 专家可能会提供其他元素。

我的两分钱到盒子里,

问候,

麦克斯

有关 EnterpriseJavaScript 错误处理的一组非常有趣的幻灯片可以在 https://web.archive.org/web/20140126104824/http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/上找到

简而言之,它总结道:

  1. 假设您的代码将失败
  2. 将错误记录到服务器
  3. 处理错误的是你,而不是浏览器
  4. 确定错误可能发生的位置
  5. 抛出你自己的错误
  6. 区分致命错误和非致命错误
  7. 提供调试模式

幻灯片进入更多的细节,大多数可能会给你一些方向。

编辑:

以上介绍可在此找到: Https://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation

雅虎的 Nicholas Zakas 在 Ajax 体验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 调用时,您会注意到两件事:

  1. 如果您的站点相当复杂,那么您将记录错误的 很多
  2. 您将看到一堆无用的“ window.error in unDefinition: 0”消息

减少日志条目的洪流就像在登录到服务器之前测试严重性和/或随机数一样简单:

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返回堆栈跟踪)。

除了其他的答案: 一个重要的事情是 使用上下文数据在 JavaScript 错误对象和 window.onerror函数参数中可用。

比如 stacktrace (errorObject.stack)、文件名、行号和列号。 请注意,每个浏览器都有一些不同... 所以尽你最大的努力,以获得良好的错误。

甚至 控制台对象本身也可能出现问题。 我使用 一个自定义的 window.onerror 函数和一个特殊的函数来跟踪受 这个密码启发的任何给定的标准错误对象。

另一个好的方法是将 Web 应用程序的版本包含在堆栈跟踪附近(用于快速、安全的复制和粘贴)。您还可能在开发模式中更积极地显示错误(警告...) ,因为开发人员不会不断地监视浏览器控制台,并且可能看不到一些问题。

还要避免使用 throw 'My message',使用 throw new Error('My message'),甚至可能有自定义错误,读取 这篇文章

总是给错误添加一些上下文(版本,对象的 id,一些自定义消息,...) ,并且确保区分外部错误(一些外部数据或环境使你的系统失败)和内部错误/断言(你自己的系统搞砸了) ,阅读“ 合同设计”。

这是 向导

还要考虑使用常规错误处理,比如拦截器,你的库和框架:

  • JQuery
  • Angular 1.x 和 < a href = “ https://stackoverflow./questions/11971213/global-ajax-error-handle-with-angularjs”> 用于 http
  • 角度2. x
  • 你的新毒品框架。

我为此创作了剧本。它阻止所有控制台命令,除了允许列表中提到的项目,或阻止块列表中的一切。即使使用彩色控制台日志也能正常工作。

Https://github.com/iiic/consolefilter.js