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

时间:2011-06-26 14:22:09

标签: javascript error-handling

我希望开始使我的JavaScript更加错误验证,并且我找到了大量有关使用trycatchfinally和{{1}的文档但是,我没有从专家那里找到关于何时何地抛出错误的大量建议。

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

我也完全是因为听过有很多章节或对错误处理的深入解释的书籍而玩游戏。 Eloquent JavaScript触及此事,但对此问题并不是非常规范或自以为是。

感谢您提供任何建议!

5 个答案:

答案 0 :(得分:57)

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

总之,它总结了:

  1. 假设您的代码将失败
  2. 将错误记录到服务器
  3. 您,而不是浏览器,处理错误
  4. 确定可能发生错误的地方
  5. 抛出自己的错误
  6. 区分致命错误与非致命错误
  7. 提供调试模式
  8. 幻灯片更详细,很可能会给你一些方向。

    更新

    上面提到的演示文稿可以在这里找到: 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调用时,你会注意到两件事:

  1. 如果您的网站相当复杂,那么您将记录错误的批次
  2. 你会看到一堆无用的“window.error in undefined:0”消息
  3. 减少日志条目的洪流就像在登录服务器之前测试严重性和/或随机数一样简单:

    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块:

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

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

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

最终,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)

我为此创建了脚本。它会阻止所有控制台命令(允许列表中提到的项目除外),或阻止所有内容。即使使用彩色控制台日志也能很好地工作。

https://github.com/iiic/consoleFilter.js