所以我想知道如何确保我的 Node 应用程序在遇到程序员错误( undefined variable 、引用错误、语法错误...)时崩溃。但是,如果我使用 promise 链,那么最终的 catch() 将捕获所有可能的错误,包括程序员错误。
例如:
PromiseA()
.then((result) => {
foo.bar(); //UNDEFINED FUNCTION HERE!!!!!
return PromiseB(result);
})
.catch(
//handle errors here
)
现在,catch()
语句还将捕获未定义函数的严重错误,然后尝试处理它。我需要一种方法让我的程序在遇到此类错误时崩溃。
编辑:我还刚刚意识到,即使我在最后一个捕获中抛出错误,它也只会被 promise 链消耗:-[。我该如何应对?
最佳答案
基本上,您想要做的是处理那些可以从中恢复的错误。这些错误通常是您在代码中抛出的错误。例如,如果在数据库中找不到某个项目,某些库将抛出错误
。他们将添加 type
属性或其他一些属性来区分不同类型的错误。
您还可以对 Error
类进行子类化,并使用 instanceof
来区分每个错误。
class myOwnError extends Error {}
然后:
Prom.catch(err => {
if(err instanceof myOwnError){ /* handle error here */ }
else { throw err; }
});
如果你想避免 if/chains,你可以在 error.constructor
上使用 switch
:
switch(err.constructor){
case myOwnError:
break;
case someOtherError:
break;
default:
throw err;
}
您还可以通过为每个可能的错误创建函数并存储它们来使用Map
或常规对象。使用 map
:
let m = new Map();
m.set(myOWnError, function(e){ /*handle error here*/ });
m.set(myOtherError, function(e){ /*handle other error here*/ });
然后就这样做:
Prom.catch(err => {
let fn = m.get(err.constructor);
if(fn){ return fn(err); }
else { throw err; }
});
关于javascript - 如何区分 promise 链中的操作错误和程序员错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51976039/