是否存在使用try catch将所有方法包装在现有javascript对象(例如第三方库)中的下降方法,以便我可以处理异常错误?当然,我将在新界面下公开这些方法。
以下是我现在想到的:(将其视为伪代码)
var MyInterface = {};
for (var property in thirdPartyLib) {
if ((typeof thirdPartyLib[property]) === 'function'){
MyInterfac[property] = function(){
try {
thirdPartyLib[property](arguments)
}
catch(err){
//do my custom processing
}
}
}
}
//developer use MyInterface object
只是想知道,任何更好的方法或任何有我上述想法的缺陷?感谢。
答案 0 :(得分:2)
几乎!唯一的问题是你没有正确传递参数。 arguments
是一个伪数组对象,它包含传递给函数调用的所有参数。你的代码最终会发生什么,是真正的函数会被一个对象调用,而不是你在包装函数中收到的各个参数。
您还可以使用闭包来执行就地包装,这样您就不必担心使用其他对象了。
function safeWrap(service, fn) {
var ogFn = service[fn];
service[fn] = function () {
try { return ogFn.apply(service, arguments); }
catch (err) {
// doh.
}
};
}
function wrapObj(service) {
for (var fn in thirdPartyLib) {
var type = typeof(thirdPartyLib[fn]);
if (type === 'function') {
safeWrap(thirdPartyLib, fn);
} else if (type === 'object') {
wrapObj(thirdPartyLib[fn]);
}
}
}
wrapObj(thirdPartyLib);
根据@ RobG的建议编辑以递归包装
如果性能有问题,您可以手动传递参数以避免使用Function.apply
:
function safeWrap(service, fn) {
var ogFn = service[fn];
service[fn] = function (a, b, c, d, e, f, g, h, i, j, k, l) {
if (arguments.length > 12) {
console.error('Time to add %s more args!', arguments.length - 12);
}
try { return ogFn.call(service, a, b, c, d, e, f, g, h, i, j, k, l); }
catch (err) {
// doh.
}
};
}