如何在Javascript中识别重新引发的错误?

时间:2019-07-24 09:24:08

标签: javascript

我在窗口上有一个全局事件侦听器,用于记录任何全局错误,如下所示:

window.addEventListener('error', logError);

但是,在某些情况下,我想以不同的方式记录与业务域相关的错误。因此,在我的代码中,我尝试将有风险的业务逻辑包装在try .. catch中,记录此特定于域的错误,然后再次将其重新引发,以使执行停止。

try {
    // some risky business logic
} catch (err) {
    // log domain specific error differently
    throw err; // re-throw error
}

在这里,重新抛出的错误再次记录在全局侦听器中。在这种情况下,是否可以绕过全局侦听器或在全局侦听器中标识是否重新抛出错误?

1 个答案:

答案 0 :(得分:0)

最简单的事情就是不重新抛出错误。

但是,如果需要,可以在错误对象上设置自己的属性,然后在全局处理程序中检查该属性。

try {
    // some risky business logic
} catch (err) {
    // log domain specific error differently
    err.myNiftyAppSuppress = true;
    throw err; // re-throw error
}

然后

window.addEventListener('error', function(err) {
    if (!err.myNiftyAppSuppress) {
        logError(err);
    }
});

请注意,我使用的名称不太可能与将来的任何标准错误属性冲突。

您还可以将其包装在一个对象中,甚至可以包装在自己的Error子类中(在ES2015 +中)。使用对象:

try {
    // some risky business logic
} catch (err) {
    // log domain specific error differently
    throw {myNiftyAppError: true, err: err};
}

然后

window.addEventListener('error', function(err) {
    if (!err.myNiftyAppError) {
        logError(err);
    }
});

或带有Error子句:

class MyError extends Error {
    constructor(err) {
        this.originalError = err;
    }
}

然后

try {
    // some risky business logic
} catch (err) {
    // log domain specific error differently
    throw new MyError(err);
}

然后

window.addEventListener('error', function(err) {
    if (!(err instanceof MyError)) {
        logError(err);
    }
});