对于错误报告,我想在我的每个函数的代码周围插入一个try-catch包装器。
所以基本上我想替换
function foo(arg){
bar();
}
...与...
function foo(arg){
try {
bar()
}
catch(e){
customErrorHandler(e)
}
}
有没有办法将这种通用的try-catch事物应用于所有函数而无需手动编辑所有函数?例如,通过修改Function对象的原型?
编辑
为什么我想尝试捕获我的所有功能: 我正在构建一个HTML5应用程序,我将在iOS和Android上发布。我可以从我目前的基本javascript错误报告中看出,即使应用程序在我自己的设备上运行良好,其他设备也会出现错误。
我的目标是双重的:每当某人的设备上发生javascript错误时......
答案 0 :(得分:11)
这并不简单,因为无法找到所有定义的JavaScript函数。例如,任何这样的方法都可能会错过在运行时定义的回调函数。
您可能也不想包装所有函数,因为这将包括您当然不想包装的JavaScript库中的浏览器函数和函数。
更好的方法可能是定义一个包装另一个函数的函数:
var tcWrapper = function(f) {
return function() {
try {
f.apply(this, arguments);
} catch(e) {
customErrorHandler(e)
}
}
}
现在您可以使用此功能来装饰您想要的任何内容。如果使用名称空间,包装将变得更加简单:
var NS = { f: function() { } }
只需将所有函数包装在一个特殊的命名空间中,然后迭代命名空间:
$.each( NS, function(i,n) {
var p = NS[i];
if( typeof p === 'function' ) {
NS[i] = tcWrapper(p);
}
} );
答案 1 :(得分:2)
我没有足够的声誉来评论接受的答案。
我在return
之前添加了f.apply
,也传递了返回值。
var tcWrapper = function(f) {
return function() {
try {
return f.apply(this, arguments);
} catch(e) {
customErrorHandler(e)
}
}
}
答案 2 :(得分:0)
好的,我似乎在这里找到了它:http://www.nczonline.net/blog/2009/04/28/javascript-error-handling-anti-pattern/
基本上,所有函数都被try-catch包装器替换为try部件中的原始函数。
答案 3 :(得分:0)
我需要强化一些代码,所以我编写了一个名为p = bkp.figure(...)
...
p.toolbar.logo = None
的函数并将其放入NPM模块中。这是一项正在进行中的工作,但它应该会有所帮助。
https://github.com/infinitered/over-armour
奖金:它适用于异步功能。欢迎反馈
答案 4 :(得分:-3)
我想知道(这是纯粹的猜测,所以不确定这是否有效)你可以这样做:
function callTryCatch(functionSignature) {
try {
eval(functionSignature);
} catch (e) {
customErrorHandler(e);
}
}
function entryPoint() {
callTryCatch(function() {
// do function logic
});
}
同样,这是纯粹的推测,我没有测试,但如果它甚至可能,我认为关键在于 eval 声明。