阅读https://blog.sentry.io/2016/01/04/client-javascript-reporting-window-onerror.html的介绍并查看 raven 的源代码,确实有必要填充onerror
通过使用 try/catch 修补每个内置函数以检索堆栈跟踪,即使给定的浏览器(例如 chrome/FF)提供了错误对象?
对我来说,如果没有必要,这似乎迫使浏览器做不必要的工作。 还是乌鸦在做其他值得这样做的事情?
编辑:可能不是,因为你似乎没有为 raven-node 做这件事。
至少它不完全是关于“我们需要错误对象”。 在某些情况下,提供的错误根本不可用,这包括现代浏览器,如 Firefox。 例如,它们可能不包括完整的堆栈,或者可能缺少详细信息(如列号)。
这里有一个大星号,我不确定这在今天是否完全正确,但不是很久以前。
tl;博士确保可预测的行为有什么危害,然后假装浏览器没有改变/有怪癖
这在很大程度上是必要的,以确保相同的错误在不同的浏览器中导致完全相同的堆栈跟踪,以便我们可以准确地将同一问题的多次出现在不同的浏览器中组合在一起。 这也与当跨域脚本抛出错误时我们如何获得不仅仅是“脚本错误”有关(参见Ben 的博客文章),并且我们从这个工具中收集了一些我们的自动面包屑。
除此之外,您描述的潜在“不必要的工作”非常少,检测window.onerror
行为的功能很难干净地完成,我们宁愿不尝试保持哪个浏览器的最新矩阵当我们可以在所有浏览器之间进行规范化时,版本会使用window.onerror
做什么。
我应该补充一点,如果没有 try/catch,我们无法在抛出非错误对象的情况下生成“合成跟踪”(例如throw "error"
)。 合成跟踪可让您查看坏对象是从哪里抛出的,这对于跟踪错误至关重要。