javascript - 如何识别 Javascript 中的重新抛出错误?
问题描述
我在窗口上有一个全局事件监听器来记录任何全局错误,如下所示:
window.addEventListener('error', logError);
但是,在某些情况下,我想以不同的方式记录与业务领域相关的错误。因此,在我的代码中,我将有风险的业务逻辑包装在 try..catch 中,记录此特定于域的错误并再次重新抛出它,以便停止执行。
try {
// some risky business logic
} catch (err) {
// log domain specific error differently
throw err; // re-throw error
}
在这里,重新抛出的错误再次记录在全局侦听器中。在这种情况下,有没有办法绕过全局监听器,或者如果重新抛出错误,可以在全局监听器中识别?
解决方案
最简单的事情就是不要重新抛出错误。
但是,如果您愿意,您可以在错误对象上设置自己的属性,然后在全局处理程序中检查该属性。
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);
}
});
推荐阅读
- javascript - e2e 测试是否应该将数据保存在真实数据库中?
- javascript - Discord text output alternative
- firebase - Firebase response payload different from documentation
- sinon - 当我尝试测试方法时如何模拟函数的请求
- python - Python 中的 While 循环 - 数组操作
- r - 惰性求值问题 - tibble 中的函数
- regex - Regex to describe binary numbers
- python-3.x - 如何用python中的while循环替换以下代码中的注释
- python - Issues scraping HTML code with Selenium WebDriver: Returned URL and action values different from the console value
- java - 从 Java-12 中的 switch 表达式返回泛型值