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

Jos*_*ody 128 javascript error-handling

我期待开始做我的JavaScript多一点错误的证明,而且我发现很多文档的使用try,catch,finally,和throw,但我不是专家在何时何地抛出错误找一吨的建议.

  • 每一段代码都应该包含在try/catch中吗?
  • 是否有更多这样的建议,在什么时候应该抓住错误?
  • 是否存在提高错误的缺点,而不是让代码在生产中无声地失败?
  • 就实现而言,这已经触及SO,但服务器日志JS错误是一种有效的策略吗?
  • 关于在我的应用程序中捕获错误,我应该知道的任何其他内容?

我也完全是因为听过有很多章节的书籍或对错误处理的深入解释而玩游戏.雄辩的JavaScript触及了这个问题,但对这个问题并没有很强的规定性或固执己见.

感谢您提出的任何建议!

cdm*_*net 58

关于企业JavaScript错误处理的一组非常有趣的幻灯片可以在http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/找到.

简而言之,它总结了:

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

幻灯片更详细,很可能会给你一些方向.

UPDATE

上面提到的演示文稿可以在这里找到:http: //www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation

  • devhands链接被打破了. (21认同)
  • 对于那些在2017年阅读此内容的人,我认为你不会从幻灯片中获得太多价值 - 这个摘要为你提供了90%的信息.它仍然是有价值的信息.干杯! (5认同)

Jen*_*and 30

雅虎的尼古拉斯扎卡斯 成名在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;
}
Run Code Online (Sandbox Code Playgroud)

一年后,Nicholas Zakas 在他的博客上发布了一个更新,其中包括一个聪明的模式,可以在生产环境中自动注入错误处理代码(使用面向方面的编程).

当您开始记录window.error调用时,您会注意到两件事:

  1. 如果您的网站相当复杂,那么您将记录很多错误
  2. 你会看到一堆无用的"window.error in undefined: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);
}
Run Code Online (Sandbox Code Playgroud)

处理无用的"window.error in undefined:0"错误取决于您的站点体系结构,但可以尝试识别所有Ajax调用并在出现故障时抛出异常(可能使用stacktrace.js返回堆栈跟踪).

  • 我知道这是一个老问题,但建议随机忽略一些错误是我听过的最糟糕的想法之一. (62认同)
  • @jbabey:对于一个小网站,你是对的,但是如果你运行一个拥有100,000或数百万用户的大型网站,你真的不需要使用冗余日志记录请求来充斥你的服务器(或互联网).在一个足够大的系统上,每一个真正的错误每天都会发生数万次,所以这种形式的限制工作得很好.这个想法实际上是在Facebook上实现的. (26认同)
  • @NickBull我在2011 - 2012年反向设计了一堆Facebook的JavaScript模块; 这就是我发现它的地方. (2认同)

JMa*_*Max 7

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

为了更好的可读性(可能性能更好,即使我不确定它会产生很大的影响),您应该在以下情况下使用try/catch块:

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

    • 在下一部分代码上创建错误(例如因为缺少var ...)
    • 使页面看不到预期的内容(对内容或CSS的影响)
    • 使结果看起来对用户来说很奇怪(对代码行为的影响)
  • 您知道您编写的代码与每个浏览器都不兼容

  • 您计划代码可能会失败(因为没有其他方法可以检查它是否应该按if ... then ... blocks)
  • 而且当您想要在不打扰最终用户的情况下进行调试

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

我的2美分到盒子里,

问候,

马克斯

  • “您想要包装的代码部分是整个算法的关键部分” - 可能取决于您希望如何处理失败。如果您知道在失败时无法继续使用该算法,最好将整个事情包装在 try/catch 中,因为如果您的 try/catch 被(例如)埋在嵌套循环中,则性能会受到更多影响. 另一方面,如果您可以对异常采取一些措施并继续算法,那么您将需要更细粒度的 try/catch 设置。 (2认同)

Chr*_*ssy 5

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

诸如堆栈跟踪 (errorObject.stack)、文件名、行号和列号之类的东西。请注意,每个浏览器都有一些差异......所以尽你最大的努力来获得好的错误。

控制台对象本身甚至可能存在问题。我使用受此启发的自定义 window.onerror 函数和受此代码启发的特殊函数来跟踪任何给定的标准错误对象。

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

也使用避免使用throw 'My message',使用throw new Error('My message'),你甚至可以有自定义错误,阅读这篇文章

始终为错误添加一些上下文(版本、对象的 id、一些自定义消息,...),并确保区分外部错误(某些外部数据或情况使您的系统失败)和内部错误/assertions(你自己的系统搞砸了),阅读“按合同设计”。

这是一个指南

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


归档时间:

查看次数:

48286 次

最近记录:

6 年,3 月 前