用try-catch包装现有javascript对象的所有方法

Wrap all methods of existing javascript object with try catch

本文关键字:对象 有方法 javascript try-catch 包装      更新时间:2023-09-26

是否有一种下降方式可以用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

只是想知道,我的上述想法有什么更好的方法或缺陷吗?谢谢

差不多了!唯一的问题是你没有正确地传递参数。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.
       }
    };  
}