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

JavaScript错误处理的最佳实践是什么?,javascript,error-handling,Javascript,Error Handling,我希望开始让我的JavaScript更加防错,我发现了大量关于使用try、catch、finally和throw的文档,但我没有从专家那里找到大量关于何时何地抛出错误的建议 是否应该将每一段代码都包装在一个try/catch中 有没有更多的建议,比如在什么时候应该发现错误 在生产中引发错误而不是让代码无声地失败是否有缺点 就实现而言,这已经涉及到了,但是服务器记录JS错误是一种有效的策略吗 关于在应用程序中捕获错误,还有什么我应该知道的吗 我也完全喜欢听那些有很棒的章节或深入解释错误处理的书

我希望开始让我的JavaScript更加防错,我发现了大量关于使用
try
catch
finally
throw
的文档,但我没有从专家那里找到大量关于何时何地抛出错误的建议


  • 是否应该将每一段代码都包装在一个try/catch中
  • 有没有更多的建议,比如在什么时候应该发现错误
  • 在生产中引发错误而不是让代码无声地失败是否有缺点
  • 就实现而言,这已经涉及到了,但是服务器记录JS错误是一种有效的策略吗
  • 关于在应用程序中捕获错误,还有什么我应该知道的吗
我也完全喜欢听那些有很棒的章节或深入解释错误处理的书。涉及到这个问题,但对这个问题不是很有规定性或固执己见


谢谢你给我的建议

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

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


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

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

  • 您计划代码可能会失败(因为没有其他方法可以通过if…then…块来检查它是否正常工作)
  • 而且当您想调试而不打扰最终用户时
最终,javascript专家可能会提供其他元素

我的2分钱到盒子里

问候,


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调用时,您将注意到两件事:

  • 如果你的网站相当复杂,你会记录很多错误
  • 您将在未定义的:0“消息中看到大量无用的“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错误处理/异常最佳实践没有发现任何结果,因此我认为尝试收集一些浓缩的想法可能会有所帮助,无论是对我自己的理解还是对未来的搜索者。也许这是