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

标签 javascript error-handling

是否有一种下降的方法可以使用 try catch 将所有方法包装在现有的 javascript 对象(例如第三方库)中,以便我可以处理异常错误?当然,我会在新接口(interface)下公开这些方法。

这是我现在想到的:(将其视为伪代码)

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.
       }
    };  
}

关于javascript - 用 try catch 包装现有 javascript 对象的所有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34346515/

相关文章:

javascript - 外部接口(interface)和 Internet Explorer 9 问题

javascript - jQuery 数据表如果数据长度大于特定长度

javascript - 可以重命名与其他类上的函数同名的 JS 函数的 IDE

ruby - Ruby Kernel方法的错误处理不起作用

excel - #N/A错误时如何使用IF语句

c++ - 在 C++ 中检查合法的整数输入

contenteditable 中的 JavaScript 缩进文本

javascript - 关于JavaScript图形动画的问题: saving and restoring a "sprite" background

javascript - Node.js 中的生产质量错误处理

c# - WPF自定义错误处理对话框?