首页 > 解决方案 > 如何识别 Javascript 中的重新抛出错误?

问题描述

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

window.addEventListener('error', logError);

但是,在某些情况下,我想以不同的方式记录与业务领域相关的错误。因此,在我的代码中,我将有风险的业务逻辑包装在 try..catch 中,记录此特定于域的错误并再次重新抛出它,以便停止执行。

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

在这里,重新抛出的错误再次记录在全局侦听器中。在这种情况下,有没有办法绕过全局监听器,或者如果重新抛出错误,可以在全局监听器中识别?

标签: javascript

解决方案


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

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

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

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

你也可以将它包装在一个对象中,或者(在 ES2015+ 中)甚至是你自己的Error子类。使用对象:

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

推荐阅读