在将 Raven 包含为 AMD 依赖项后,我无法弄清楚如何恢复window.onerror
事件。
我不想在开发过程中使用 Raven,所以我只在生产模式下调用config()
/ install()
。 但是在开发模式下,所有错误仍然被TraceKit.report()
抛出......这非常令人沮丧,因为文件/行号/堆栈跟踪在浏览器开发工具中不再有帮助。
我试过在开发模式下调用uninstall()
但这没有帮助。 你是否有理由绑定到window.onerror
,而不是在config()
或install()
中执行它?
找到了解决方案,但并不理想...
我试图在开发模式下手动设置window.onerror = null
,但即使这样也没有用。 问题是我在几个模块中使用了require()
,并且每次 Raven 都重新绑定到window.onerror
。
因此,我停止使用noConflict()
,将其作为全局依赖项包含在 requirejs 配置中,并将其作为本地依赖项从其他模块中删除。 这允许设置window.onerror = null
而无需 Raven 稍后重新绑定事件。
相当混乱的修复虽然:(
@adambiggs另一个解决方案是为 Raven-js 创建一个包装 AMD 模块,该模块执行配置和安装调用,这意味着您只能导入 raven-js 一次,但可以多次导入您自己的模块,afaik。
我认为这可能与: https ://github.com/getsentry/raven-js/pull/109 和https://github.com/getsentry/raven-js/issues/91#issuecomment -15560074 有关
这应该不再相关。 window.onerror
在调用install()
之前不会发生突变,并在调用uninstall()
时恢复。 让我知道是否还有其他问题。
@mattrobenolt ,我已经升级到 1.1.11 并且我没有调用install()
并且我仍然会遇到 raven 处理错误。
@bobbyrenwick你能把我链接到显示这种情况的公开内容吗?
有解决方法吗? 即使我从不调用Raven.config()
或Raven.install()
或者如果我调用Raven.config(false)
,jquery 或 onerror 处理程序似乎仍然被安装。 唯一的解决方法似乎是从不加载 raven js(这不太理想)。
见:#282 :)
您是否仅提供 #282 作为背景? 我在那里看不到任何解决方法。
是的,因为还没有解决方案。
我唯一的解决方法是在if
块中使用require()
(我的其余代码现在使用import
:(
有这方面的更新吗?
任何更新? 它仍然无法正常工作。
编辑:对不起我的语气。 度过了漫长的一天。
你想做什么? 我正在这样做,效果很好:
if (process.env.RAVEN_DSN) {
require('raven-js').config(process.env.RAVEN_DSN, {
environment: process.env.NODE_ENV,
}).install();
}
其中process.env.RAVEN_DSN
当然是 DSN,并且仅在构建我希望 Raven 运行的环境时通过webpack.EnvironmentPlugin
设置。
在您的版本中,不可能有条件地设置 Angular ErrorHandler。 要么你在每种情况下都设置它,然后无论如何它都会吞下你的错误,或者不要但仍然在提供程序中列出它,这 od dev 会导致整个模块崩溃。
据我所知,不可能根据条件使用或不使用 Angular 提供程序。
我今天做了很多次修复尝试。
老实说,这听起来像是一个 Angular 问题,而不是 Raven 问题。
话虽如此,我同意一个更通用的解决方案将是一个很好的补充。
只是一个想法:您是否尝试过在ignoreUrls
选项中设置一个匹配所有 URL 的模式? 那会做你需要的吗? 像ignoreUrls: [/./]
这样的东西?
或者也许将sampleRate
设置为零?
可以阻止 Raven 发送请求甚至捕获错误,但这并不能阻止 Angular ErrorHandler 吞下错误(= 至少会丢失引发错误的实际行的跟踪)。
我想你是对的,毕竟这不是 Raven 的问题。
对于那些来这里试图弄清楚的人来说,这是我一开始错过的配置选项shouldSendCallback
:
import Raven from 'raven-js';
const env = 'prod';
const release = '12345';
Raven
.config('https://<example>@sentry.io/1234', {
environment: env,
release: release,
shouldSendCallback: () => {
// Do your logic here...
return ['prod', 'staging'].indexOf(env) !== -1;
},
})
.install();
如果shouldSendCallback
是false
哨兵将不会报告。 有了这个👍,您的代码中无需条件报告逻辑。
将您的 DSN 设为空字符串。 它将禁用报告
我用过这种方式。 它似乎对我有用
if (environment.production) {
Raven.config('https://@sentry.io/')
.install();
}
在提供者中providers: [environment.production ? { provide: ErrorHandler, useClass: RavenErrorHandler } : [], ...
如果我在这里做错了什么,请告诉我。
最有用的评论
对于那些来这里试图弄清楚的人来说,这是我一开始错过的配置选项
shouldSendCallback
:如果
shouldSendCallback
是false
哨兵将不会报告。 有了这个👍,您的代码中无需条件报告逻辑。