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

What are the best practices for JavaScript error handling?

我想让我的javascript更具防错性,我发现了很多关于使用trycatchfinallythrow的文档,但我没有从专家那里找到关于何时何地抛出错误的大量建议。

  • 每段代码都应该包装在一个try/catch中吗?
  • 关于什么时候应该发现错误,还有更多这样的建议吗?
  • 在生产中,是否存在引发错误而不是让代码安静地失败的缺点?
  • 就实现而言,这已经被提到了,但是服务器记录JS错误是否是一种有效的策略?
  • 关于在我的应用程序中捕获错误,还有什么我应该知道的吗?

我也完全是一个游戏,听那些有伟大的章节或深入的错误处理解释的书。雄辩的javascript涉及到这一问题,但并不是很规范或对这一问题有意见。

谢谢你的建议!


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

简而言之,它总结了:

  • 假设您的代码将失败
  • 将错误记录到服务器
  • 你,而不是浏览器,处理错误
  • 确定错误可能发生的位置
  • 自投罗网
  • 区分致命错误和非致命错误
  • 提供调试模式
  • 幻灯片将更详细地介绍,很可能会给您一些指导。

    更新

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


    雅虎的尼古拉斯·扎卡斯!Fame在Ajax Experience 2008上做了一次关于企业错误处理(幻灯片)的演讲,他在演讲中提出了如下建议:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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;
    }

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

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

  • 如果你的网站相当复杂,你会记录很多错误
  • 您将看到一堆无用的"window.error in undefined:0"消息
  • 减少日志条目的洪流与在登录到服务器之前测试严重性和/或随机数一样简单:

    1
    2
    3
    4
    5
    6
    7
    8
    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中处理无用的"window.error"错误取决于您的站点体系结构,但可以尝试识别所有Ajax调用,并在发生故障时引发异常(可能使用stack trace.js返回堆栈跟踪)。


    IHMO,你应该使用JavaScript中的错误处理,就像你用其他几种语言(AFAIK:Python,Java)一样。

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

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

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

    • 您计划了代码可能会失败(因为没有其他方法可以检查它是否应该通过if…then…方块)
    • 而且,当您希望在不干扰最终用户的情况下进行调试时

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

    我的2美分到盒子里,

    当做,

    马克斯


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

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

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

    另一个好的地方是在stacktrace附近包含Web应用程序的版本(为了快速、安全地复制和粘贴)。在开发模式中,您还可能更积极地显示错误(警报…),因为开发人员不会经常监视浏览器控制台,也可能看不到某些问题。

    还可以使用避免使用throw 'My message',使用throw new Error('My message'),甚至可以有自定义错误,阅读本文。

    始终在错误中添加一些上下文(版本、对象的ID、一些自定义消息等),并确保区分外部错误(某些外部数据或强制导致系统失败)和内部错误/断言(您自己的系统混乱),阅读"按合同设计"。

    这是导游。

    还可以考虑使用常规的错误处理,比如拦截器、lib和框架:

    • JQuery
    • 角度1.x和HTTP
    • 角2
    • 你的新毒品框架…