- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为了简化调试,我在 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 类型(无论是 ReferenceError
、String
还是 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) 的改进,这不再是必需的,但为了完整性,我将第二种技术留在这里,因为 onerror
是 not 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.ErrorHandler
和 goog.debug.ErrorReporter
。
关于javascript - 如何覆盖/扩展 Chrome 的 JavaScript 中的 ReferenceError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17712995/
描述:。在我的Vue 3和nuxt 3项目中,我使用VITEST进行测试。但我在运行测试时遇到了一个问题:。版本。以下是我的页面代码:。下面是我的测试myest.spec.ts:。以下是我的vites
你好吗?我正在研究带有 Ionic 3 教程的 Google map 。我已经完成了那里解释的一切,但是当项目启动时,出现了这个错误。我调查了很多,但没有任何效果。谢谢! Error: Uncaugh
我刚刚开始使用 Node.js 并尝试使用模块。我已经安装了 Node 和 npm,并确保一切顺利。我将在下面添加代码来向您展示我得到了什么。 我有两个 js 文件,它们在这里。 app.js: va
我是 Angularjs 的初学者,在理解模块和作用域方面有些困难。 我不断收到范围未定义的错误,但我不明白为什么。首先,我将 Controller 链接到我设置路由的位置,但是由于在单击提交按钮时调
我正在制作一个 HTML 模板引擎。 程序遍历 HTML,并找到 {{ }} 的所有实例。然后它会遍历计数器中的所有键,并用对 Controller 的引用替换变量名称的实例。 例如,如果我的 Con
在我的 React Native 应用程序中,我有一个 ProductScreen,其中导入两个文件来完成屏幕。 文件 1 (Products.js) 是我的产品列表 文件 2 (Data.js) 是
我有以下类(class): class ScheduledContent { constructor(knex) { this.knex = knex } ge
在以下代码中,obj.sayhello() 行意味着sayhello在 obj 的上下文/范围内执行。 str未在 var 中定义(通过 sayhello )方法。 JS 将在范围内查找变量,即在
我正在尝试使用字符串作为函数的一部分。 const import1 = require('./import1'); const import2 = require('./import2'); //on
var g = { lang: "ttt", l: function(){ console.log(lang); } } console.log(g.l());
$(document).ready(function(){ $('#name').val('Name1'); }); function clickMe(){ console.lo
我刚刚完成了 Meteor 包的开发。现在我想通过将它添加到新的 Meteor 应用程序来测试它: my_cool_package_name/package.js Package.on_use(fun
我在给定的 SSCCE 代码中收到以下错误: Error: ReferenceError: electron is not defined Source File: http://localhost/
我正在关注一个简单的 tut,它有望构建一个响应式 slider ,但是它一直告诉我控制台中有一个错误指向一个名为 advance() 的函数 这是 slider 的简单 html:
我正在尝试使用基于按钮点击的表格中的数据填充表格。我正在将数据传递到 javascript 函数中。 )" id="modifyEdu" class="btn btn-primary"
我需要能够检查一个变量是否存在(如果它没有分配给 {})而不在 javascript 中抛出错误。当我尝试这段代码时 if (a) {} 它抛出 Uncaught ReferenceError
我在设置中有一个 mochajs 测试文件和一个 javascript 代码文件,如下所示: /js/module/codefile.js /js/test/testfile.js codefile.
我正在尝试构建一个简单的 Bookmarklet,它将一些外部 Javascript 加载到页面中,目标是将像 Stackoverflow 那样的 Markdown 编辑器添加到另一个站点。我可以使用
我有一个基于 Django 的网络应用程序。我用 Scrapy Crawler抓取网页。目前,我的目标是能够使用 jQuery 和 AJAX 请求从网页内控制爬虫。 我的理论设置如下: 在网页上,我有
以下 JavaScript... if (eval('typeof admin_post_css_theme_dark-moon)=='function')) {/**/} ...触发以下错误消息..
我是一名优秀的程序员,十分优秀!