gpt4 book ai didi

javascript - 如何覆盖/扩展 Chrome 的 JavaScript 中的 ReferenceError?

转载 作者:可可西里 更新时间:2023-11-01 01:42:23 24 4
gpt4 key购买 nike

为了简化调试,我在 Chrome 中捕获了所有控制台日志,以便提交反馈条目的用户也将所有日志提交到我们的服务器。当有人在生产中遇到问题时,我可以首先让他们恢复工作,这样我就可以坐下来更彻底地检查所有日志,以确定用户在生产中遇到的任何问题的根本原因。

我用来捕获日志的技术涉及覆盖 console.log,以便在第一个参数中输入的所有文本都存储在一个数组中,同时调用遗留函数,这样我仍然可以在控制台中看到日志。

问题是偶尔会出现未捕获的异常。这些未包含在上传的日志中,因此并不总是很清楚导致问题的原因。所以我尝试通过编写一个将函数作为参数的 JavaScript 函数来覆盖 ReferenceError,然后返回一个用它做事的新函数,比如将数据存储在一个变量中,然后在最后一步调用遗留函数:

function overrideException(legacyFn) {  

/** arguments for original fn **/
return function() {

var args = [];

args[0] = arguments[0];

// pass in as arguments to original function and store result to
// prove we overrode the ReferenceError
output = ">> " + legacyFn.apply(this, args).stack;

return legacyFn.apply(this, arguments);
}

}

为了测试 overrideException 函数,我在控制台上运行了以下代码:

ReferenceError = overrideException(ReferenceError);

之后,我通过手动抛出一个 ReferenceError 来测试返回的函数,即新的 ReferenceError:

throw new ReferenceError("YES!! IT WORKS! HAHAHA!");

控制台上的结果输出是:

ReferenceError: YES!! IT WORKS! HAHAHA!

并且从 overrideException 函数检查全局变量 output 表明它确实运行了:

output
">> ReferenceError: YES!! IT WORKS! HAHAHA!
at ReferenceError (<anonymous>)
at new <anonymous> (<anonymous>:18:35)
at <anonymous>:2:7
at Object.InjectedScript._evaluateOn (<anonymous>:562:39)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:521:52)
at Object.InjectedScript.evaluate (<anonymous>:440:21)"

现在,事情开始分崩离析了。在我们的代码中,我们不知道何时会发生未捕获的异常,因此我通过尝试运行一个不存在的函数来测试它:

ttt();

结果是:

ReferenceError: ttt is not defined

但是,与我们明确抛出错误的情况不同,在这种情况下,函数不会触发,我们只剩下遗留功能。变量 output 的内容与第一个测试相同。

所以问题似乎是这样的:我们如何覆盖 JavaScript 引擎用来抛出错误的 ReferenceError 功能,以便它与我们抛出 ReferenceError 时使用的功能相同?

请记住,目前我的问题仅限于 Chrome;我正在构建 Chrome 打包应用。

最佳答案

出于同样的原因,我做了很多研究:我想记录错误并报告它们。

“覆盖” native 类型(无论是 ReferenceErrorString 还是 Array)是不可能的。

Chrome 在运行任何 Javascript 之前绑定(bind)这些,因此重新定义 window.ReferenceError 没有任何效果。

您可以使用类似ReferenceError.prototype.extension = function() { return 0; 的东西来扩展ReferenceError },甚至覆盖 toString(为了保持一致性,请在页面而不是开发工具上尝试)。

这对你帮助不大。

不过不用担心....

(1) 使用window.onerror 获取未捕获错误的文件名、1 索引行号和0 索引位置,以及错误本身。

var errorData = [];
onerror = function(message, file, line, position, error) {
errorData.push({message:message, file:file, line:line, position:position, error:error});
};

参见 fiddle举个例子。由于 OP 是特定于 Chrome 的,因此仅经过测试可在 Chrome 中使用。

(2) 由于对 (1) 的改进,这不再是必需的,但为了完整性,我将第二种技术留在这里,因为 onerrornot guaranteed to work for all errors on all browsers .您有时还会看到以下内容:

var errors = [];
function protectedFunction(f) {
return function() {
try {
f.apply(this, arguments);
} catch(e) {
errors.push(e);
throw e;
}
};
}
setTimeout = protectedFunction(setTimeout);
setInterval = protectedFunction(setInterval);
etc...

仅供引用,所有这些与 Google Closure Compiler 库中所做的非常相似,在 goog.debug 中。 ,在 Gmail 开发过程中创建,目的就是为了做到这一点。特别感兴趣的是 goog.debug.ErrorHandlergoog.debug.ErrorReporter

关于javascript - 如何覆盖/扩展 Chrome 的 JavaScript 中的 ReferenceError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17712995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com