我在窗口上有一个全局事件侦听器,用于记录任何全局错误,如下所示:
window.addEventListener('error', logError);
但是,在某些情况下,我想以不同的方式记录与业务域相关的错误。因此,在我的代码中,我尝试将有风险的业务逻辑包装在try .. catch中,记录此特定于域的错误,然后再次将其重新引发,以使执行停止。
try {
// some risky business logic
} catch (err) {
// log domain specific error differently
throw err; // re-throw error
}
在这里,重新抛出的错误再次记录在全局侦听器中。在这种情况下,是否可以绕过全局侦听器或在全局侦听器中标识是否重新抛出错误?
答案 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);
}
});