我期待开始做我的JavaScript多一点错误的证明,而且我发现很多文档的使用try
,catch
,finally
,和throw
,但我不是专家在何时何地抛出错误找一吨的建议。
- 是否应将每段代码都包裹在try / catch中?
- 有没有想更多的意见本上在什么点错误应该被抓?
- 产生错误而不是使代码在生产中静默失败是否有缺点?
- SO在实现方面已涉及到这一点,但是服务器记录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
雅虎的尼古拉斯·扎卡斯(Nicholas Zakas)!名声在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调用时,您将注意到两件事:
- 如果您的网站相当复杂,则会记录很多错误
- 您将看到一堆无用的“ window.error in undefined:0”消息
减少日志条目的洪流就像在登录服务器之前测试严重性和/或随机数一样简单:
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);
}
处理无用的“ undefined:0中的window.error”错误取决于您的站点体系结构,但是可以尝试识别所有Ajax调用并在出现故障时引发异常(可能使用stacktrace.js返回堆栈跟踪)。
IHMO,您应该像其他几种语言(AFAIK:Python,Java)一样在javascript中使用错误处理。
为了获得更好的可读性(即使我不确定它是否会产生很大的影响,也可能会有更好的性能),您应该在以下情况下主要使用try / catch块:
-
您要包装的代码部分是整个算法的关键部分。如果失败,则可能:
- 在代码的下一部分上创建错误(例如,因为缺少var ...)
- 使页面看起来不像预期的那样(对内容或CSS的影响)
- 使结果对用户看起来很奇怪(影响代码行为)
-
您知道您正在编写的代码与每个浏览器都不兼容
- 您计划代码可能失败(因为没有其他方法可以通过... then ...块检查它是否可以工作)
- 而且,当您想调试而又不打扰最终用户时
最终,JavaScript专家可能还会提供其他元素。
我的2美分到盒子里
问候,
最高
除其他答案外:重要的一点是使用JavaScript错误对象和window.onerror
函数参数中可用的上下文数据。
诸如stacktrace(errorObject.stack),文件名,行号和列号之类的东西。请注意,每个浏览器都有一些差异...因此,请尽最大努力获取正确的错误。
控制台对象本身甚至可能存在问题。我使用一个受此启发的自定义window.onerror函数和一个特殊函数来跟踪受此代码启发的任何给定的标准错误对象。
另一个好处是将Web应用程序的版本包括在靠近stacktrace的位置(以便快速安全地进行复制和粘贴)。在开发模式下,由于开发人员将不会持续监视浏览器控制台并且可能看不到某些问题,因此您也可能会更主动地显示错误(警告...)。
也可以使用避免使用throw 'My message'
,使用throw new Error('My message')
,甚至可以自定义错误,请阅读本文。
始终在错误中添加一些上下文(版本,对象的ID,一些自定义消息等),并确保区分外部错误(某些外部数据或情况导致系统出现故障)和内部错误/ assertions(您自己的系统搞砸了),请阅读有关“按合同设计”的信息。
这是一个指南。
还要考虑使用一般的错误处理,例如拦截器的库和框架:
- jQuery的
- Angular 1.x和http
- 角2.x
- 您的新涂料框架在这里...
我为此创建了脚本。它会阻止所有控制台命令(允许列表中提到的项目除外),或阻止所有内容。即使使用彩色控制台日志也能很好地工作。
文章标签:error-handling , javascript
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!