有没有一种方法可以将try-catch添加到Javascript中的每个函数中

Is there a way to add try-catch to every function in Javascript?

本文关键字:Javascript 添加 函数 try-catch 一种 方法 有没有      更新时间:2024-07-01

为了报告错误,我想在我拥有的每个函数的代码周围插入一个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. 我想大致知道错误发生在哪里,这样我就知道在哪里查找问题

这并不简单,因为没有办法找到到处定义的所有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);
    }
} );

我没有足够的声誉来评论接受的答案。

我在f.apply之前添加了一个return,以传递返回值。

var tcWrapper = function(f) {
    return function() {
        try {
            return f.apply(this, arguments);
        } catch(e) {
            customErrorHandler(e)
        }
    }
}

给出的答案已经很好了,只是想使用闭包共享一个新的答案。

定义包装器

const tryCatchWrapper = (executable) => async (...args) => {
    try {
        const result = await executable(...args);
        return result;
    } catch (error) {
        // use any custom handler here
       error.message = `[${executable.name}] - ${error.message}`;
       error.data = {...error.data, input_args: args}
       throw error;
    }
}

没有try-catch包装器的函数

const myFunction = async (x, y) => {
    const sum = x + y;
    if (sum > 10) throw new Error(`sum > 10 custom error`)
    return sum;
}

如何使用

try {
    const wrapperFunction = trycatchWrapper3(myFunction2);
    const output = await wrapperFunction(2, 93)
    console.log(output)
} catch (error) {
    console.error(error)
}

结束

好吧,我似乎在这里找到了它:http://www.nczonline.net/blog/2009/04/28/javascript-error-handling-anti-pattern/

基本上,所有函数都被try-catch包装器替换,该包装器具有try部分中的原始函数。

我需要加强一些代码,所以我编写了一个名为fortify的函数,并将其放入NPM模块中。这是一项正在进行的工作,但应该会有所帮助。

https://github.com/infinitered/over-armour

奖金:它与异步函数一起工作。欢迎反馈

我想知道(这只是猜测,所以不确定这是否可行)你可以做这样的事情:

function callTryCatch(functionSignature) {
    try {
        eval(functionSignature);
    } catch (e) {
        customErrorHandler(e);
    }
}
function entryPoint() {
    callTryCatch(function() {
        // do function logic
    });
}

同样,这纯粹是猜测,我还没有测试过,但如果可能的话,我认为关键在于eval语句。