有没有办法在Javascript中为每个函数添加try-catch?

时间:2012-07-31 14:08:51

标签: javascript error-handling try-catch prototype

对于错误报告,我想在我的每个函数的代码周围插入一个try-catch包装器。

所以基本上我想替换

function foo(arg){
   bar();
}

...与...

function foo(arg){
    try {
        bar() 
    }
    catch(e){
        customErrorHandler(e)
    }
}

有没有办法将这种通用的try-catch事物应用于所有函数而无需手动编辑所有函数?例如,通过修改Function对象的原型?

编辑

为什么我想尝试捕获我的所有功能: 我正在构建一个HTML5应用程序,我将在iOS和Android上发布。我可以从我目前的基本javascript错误报告中看出,即使应用程序在我自己的设备上运行良好,其他设备也会出现错误。

我的目标是双重的:每当某人的设备上发生javascript错误时......

  1. 我想通知用户该应用可能无法正常运行
  2. 我想知道错误发生的地方,所以我知道在哪里寻找问题

5 个答案:

答案 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 声明。