1

从字符串而不是 .js 文件引入的 javascript 很难调试,因为错误引用了包含错误的脚本文件的 url。如果引入了很多字符串,则很难判断哪个字符串(脚本)是错误的来源。

我有大量的对象。每个对象都有一个字符串,它将动态定义其 javascript 函数。一旦定义了函数,我需要一种方法来处理在执行这些动态定义的函数期间发生的错误,以报告某种信息,指示哪个字符串/对象是错误的来源。

示例 1:使用 eval() 注入函数

如果您使用 eval() 将字符串作为 javascript 插入,则错误 url 未定义。

str = "test_fn = function(){undefined_fn();}";
eval(str);
test_fn();

将产生以下错误:

message: "ReferenceError: Can't find variable: undefined_fn"
url: undefined
line: 1

所以在这种情况下,错误 url 是未定义的。

示例 2:使用脚本标签注入函数

如果您使用脚本标签代替 eval 将字符串作为 javascript 插入,则错误 url 引用 html 文件。

str = "test_fn = function(){undefined_fn();}";
if(!document.head) document.head = document.getElementsByTagName('head')[0];
var elem = document.createElement('script');
elem.text = str;
document.head.appendChild(elem);
test_fn();

将产生以下错误:

message: "ReferenceError: Can't find variable: undefined_fn"
url: "testpage.html"
line: 1

所以在这种情况下,错误 url 是 html 页面。

我需要一种方法来处理在执行这些动态定义的函数期间发生的错误,以便向开发人员报告某种信息,指示哪个字符串是错误的来源。我知道我可以使用服务器动态生成大量源文件,然后为每个文件设置 script.src,但是我想避免引用数百个脚本文件。我宁愿了解如何修改报告的 url,或者传递一些可以报告给开发人员的附加信息。

我更喜欢跨浏览器解决方案,但由于这仅用于开发,因此没有必要。

这些示例中的错误是使用以下方法报告的:window.onerror = function(message, url, line) {}

4

1 回答 1

1

那这个呢:

function SuperError(msg, location) {
   this.message = msg;
   this.url = location;
}

str = "test_fn = function(){try { undefined_fn(); } catch(e) {throw new SuperError('undefined_fn is undefined', 'in dynamic script head')}}";
于 2011-09-19T20:28:00.210 回答