JavaScripterror handling的最佳做法是什么?

我正在寻找开始使我的JavaScript更加错误的certificate,并且我发现了大量关于使用trycatchfinallythrow的文档,但是我没有从专家那里得到关于何时何地的大量build议抛出错误。

  • 每一段代码都应该包装在try / catch中吗?
  • 是否有更多的这样的build议在哪个点应该被捕获?
  • 提高错误而不是让代码在生产中默默地失败有缺点吗?
  • 至于实现方面,这已经被触及到,但是服务器日志loggingJS错误是一个有效的策略?
  • 还有什么我应该知道的,关于在我的应用程序陷阱错误?

我也完全听说有很好的章节或对error handling的深入解释的书籍。 雄辩的JavaScript触及了这个问题,但是对这个问题并没有很强的规定性或者自认性。

感谢您的任何build议,你可以给!

有关Enterprise JavaScripterror handling的幻灯片集可以在http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/上find

总之它总结了:

  1. 假设你的代码将会失败
  2. 将错误logging到服务器
  3. 你,而不是浏览器,处理错误
  4. 确定可能发生错误的地方
  5. 抛出自己的错误
  6. 区分致命错误与非致命错误
  7. 提供一个debugging模式

幻灯片更详细,最有可能会给你一些方向。

UPDATE

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

Yahoo!的Nicholas Zakas 名气在2008年的Ajax Experience上做了关于企业error handling( 幻灯片 )的演讲,他在其中提出了这样一个问题:

 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 在他的博客上发布了一个更新,其中包括一个聪明的模式,用于在生产环境中自动注入error handling代码(使用面向方面的编程)。

当你开始loggingwindow.error调用时,你会注意到两件事情:

  1. 如果你的网站相当复杂,你会logging很多错误
  2. 你会看到一堆无用的“window.error in undefined:0”消息

减less日志条目的洪stream与在login到服务器之前testing严重性和/或随机数一样简单:

 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:0”错误取决于您的站点体系结构,但可以尝试标识所有Ajax调用,并在发生某些失败时引发exception(可能使用stacktrace.js返回堆栈跟踪)。

IHMO,你应该像使用其他几种语言一样在JavaScript中使用error handling(AFAIK:Python,Java)。

为了更好的可读性(也许更好的性能,即使我不确定它有一个非常大的影响),你应该使用try / catch块主要在以下情况:

  • 你想要包装的部分代码是整个algorithm的关键部分 。 如果失败,可以:

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

  • 你计划的代码可能会失败 (因为没有其他方法来检查它应该工作,如果…然后…块)
  • 而且当你想debugging而不打扰最终用户

最终,JavaScript专家可能会有其他元素给予。

我的2美分的框,

问候,

马克斯

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

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

控制台对象本身甚至可能有问题。 我使用了一个自定义的window.onerror函数,这个函数的灵感来自于这个代码,还有一个特殊的函数来跟踪任何给定的标准错误对象。

另外一个好的方面就是把你的web应用程序的版本包含在栈跟踪附近(快速和安全的复制和粘贴)。 您也可能在开发模式中更积极地(警告…)显示错误,因为开发人员不会持续监视浏览器控制台,并且可能看不到某些问题。

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

总是添加一些上下文到错误(版本,对象的id,一些自定义的消息,…),并确保你区分外部错误(一些外部数据或强制让你的系统失败)和内部错误/断言(你自己的系统搞砸了),阅读“ 按合同devise ”。

这是一个指南 。

还要考虑像拦截器一样使用一般的error handling你的库和框架:

  • jQuery的
  • Angular 1.x和http
  • Angular 2.x
  • 你的新的dope框架在这里…