Sentry-javascript: 自动记录所有抛出的错误?

创建于 2013-02-10  ·  31评论  ·  资料来源: getsentry/sentry-javascript

有没有办法让 Raven 记录所有抛出的错误? 出于某种原因,它会记录一些throw调用,但不会记录其他调用。 我发现它往往不会记录嵌套在调用堆栈下方的行为。

最有用的评论

干得好:

var __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

window.Error = (function(_super) {

  __extends(_Class, _super);

  function _Class() {
    var error;
    error = _Class.__super__.constructor.apply(this, arguments);
    Raven.captureException(error);
    return error;
  }

  return _Class;

})(Error);

所有31条评论

哈哈,Javascript 中的错误处理真的很糟糕。 你能给我一个你如何抛出错误的例子吗?

例如,抛出一个字符串不允许我们获取除了发送的消息之外的任何信息。 使用实际的Error对象,我们可以(尝试)获取堆栈。

因此,信息越多越好。

确实。

我抛出这样的错误:

throw new Error("Error");

有时它会登录哨兵,有时则不会。

这是在我可以在某个地方查看的页面上吗? 或者你可以把它放在某个地方吗? 老实说,这只是没有足够的信息。 有大约 10 个因素可以解释为什么错误没有被记录下来,其中大部分都不是我们能控制的。 :) 所以如果我能看到完整的上下文,我可以给你一个建议来帮助浏览器。

该应用程序实际上是用 CoffeeScript 编写的,它使用 require.js 编译为 JavaScript。 主入口点如下所示:

Raven.config('http://[email protected]');
Raven.context(function() {
  define(['cs!csmain']);
});

我也尝试过不使用context包装器,但这似乎并没有改变任何东西。 它仍然记录在调用堆栈中较高的throw调用,而忽略下面的调用。

你在跑步Raven.install()

对于 require.js,如果您明确想要包装模块,您可以:

define(['module'], Raven.wrap(function(module) {
  // insert cool stuff here
}));

我在片段中忘记了它,但我在config() install() #$

我没有尝试过包裹模块,但我想如果它已经在某些地方工作了,为什么不能在其他地方呢?

这一切都取决于调用堆栈。 当事情开始进入异步领域时,它会变得很艰难。 例如,这不会按预期进行:

Raven.context(function() {
  setTimeout(function() {
    throw new Error('crap');
  }, 1);
});

内部函数在主上下文之外的自己的上下文中运行。 Node.js 用一个叫做“域”的东西解决了这个问题,但遗憾的是,这些在浏览器领域并不存在。

因此,如果一个错误未被发现并一直冒泡到顶部,它通常会被拒绝,因为它在那时 100% 毫无价值。

啊,我明白了。 也许有一种方法可以利用window.onerror

FWIW,如果可能的话,捕获异常的最可靠方法是显式使用Raven.captureException 。 我知道这并不总是可行的,只是仅供参考。

所以一个明确的 try...except 块是最可靠的:

try {
  throw new Error('something');
} catch(e) {
  Raven.captureException(e);
}

正确的。 当然,自动捕获错误会很棒,但是 JavaScript 并没有让它成为一个简单的游戏......

@pheuter不。 :) 这就是有趣的部分。 一旦错误到达 window.onerror,它就不再是一个实际的Error对象了。 它变平为只是一个无用的字符串。 它还强加了跨域安全问题。 所以基本上,一旦发生错误window.onerror ,它通常会被丢弃,因为我们拥有的唯一信息可能只有: "Script error."

糟透了。 哦,我很感激你的澄清!

不,Javascript 没有。 事实上,这真的很可怕。 :) 我正在积极研究和探索利用浏览器为我们提供更好信息的方法。 这个想法甚至让我想到了猴子补丁Function.prototype.call 。 但这可能真的是个坏消息。

完全! 如果您对澄清文档有任何建议或建议,请告诉我。 我一直在寻找那些东西。

会的,配置和使用文档非常简单易懂。

我想知道是否有办法扩展Error来完成这项工作。

@mattrobenolt ,这是我们使用 CoffeeScript 所采用的方法。

window.Error = class extends Error
  constructor: ->
    error = super
    Raven.captureException error
    return error

然后只需使用throw new Error "Test Error"

更新了上面的评论以进行澄清。

唔。 我会在周末玩这个。 最后我试过,它不会让我修补window.Error。 我会在更多浏览器中再试一次,看看有什么可能。

感谢您的提醒!

另外,你能用普通的Javascript给我吗? 我很确定它在做什么,我只是想仔细检查一下。 我不写 Coffeescript。

干得好:

var __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

window.Error = (function(_super) {

  __extends(_Class, _super);

  function _Class() {
    var error;
    error = _Class.__super__.constructor.apply(this, arguments);
    Raven.captureException(error);
    return error;
  }

  return _Class;

})(Error);

现在想来,这是一种有缺陷的方法。 只是重写构造函数将导致 Raven 捕获每个错误对象,无论它是否被抛出。 :)

仅供参考,errorception 找到了一种方法来处理这个问题。 如果 raven-js 也能做到这一点,那就太好了。

@dmcquay你能提供一个Errorception捕获的例子吗? 我可能可以对其进行逆向工程。

我实际上假设所有 JS 错误处理程序都是 50% raven.js ;)

:船尾:

@BYK ,有什么想法吗?

我对错误接收没有任何内部知识。 我正在使用该服务,它似乎像宣传的那样工作。 这是我知道的全部。

我检查了它们的工作方式,看起来它们只是将自己附加到window.onerror并且不关心堆栈跟踪。 至少对于这类事情。

劫持 Error 对象适用于 Firefox,但@mattrobenolt关于捕获所有这些对象的观点,即使是那些没有被抛出的对象也是一个有效的问题。

一个肮脏的解决方法可能是通过劫持全局构造函数来存储创建的Error实例,并监听onerror并比较messagefileNamelineNo参数与存储的错误对象的属性。 如果找到匹配项,则将其从队列中删除并报告。

在评估所有错误通知服务时,我注意到一些特定于 Javascript 的服务(例如 https://qbaka.com/)确实会跟踪堆栈跟踪并显示导致特定错误的用户操作。 太糟糕的错误接收并没有做到这一点,因为它在其他方面似乎都更胜一筹。

我们将在我们的 Django 代码中使用 Sentry,我在寻找有关 Sentry 如何用于 Javascript 的信息时偶然发现了这个问题。 raven-js 的当前实现是否需要代码显式捕获所有 JS 错误并将它们报告给 Sentry?

@adityar7它没有。 如果可以的话,Raven.js 会尽力进行修补和拦截。 在一些更极端的情况下,您可能需要显式包装,但我们非常努力地让事情自动发生。

@mattrobenolt通过修复一些语法让它工作。 谢谢!

此页面是否有帮助?
0 / 5 - 0 等级