JavaScripterror handling的最佳做法是什么?
我正在寻找开始使我的JavaScript更加错误的certificate,并且我发现了大量关于使用try
, catch
, finally
和throw
的文档,但是我没有从专家那里得到关于何时何地的大量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
总之它总结了:
- 假设你的代码将会失败
- 将错误logging到服务器
- 你,而不是浏览器,处理错误
- 确定可能发生错误的地方
- 抛出自己的错误
- 区分致命错误与非致命错误
- 提供一个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调用时,你会注意到两件事情:
- 如果你的网站相当复杂,你会logging很多错误
- 你会看到一堆无用的“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框架在这里…