javascript - 如何区分 promise 链中的操作错误和程序员错误?

标签 javascript node.js es6-promise

所以我想知道如何确保我的 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/

相关文章:

javascript - 从 KnockoutJS 中动态生成的输入中获取值

javascript - 通过ajax post和codeigniter加载函数加载页面内容时,head部分的一些jquery函数无法调用

javascript - Atom linter/es-lint 禁用一些警告

node.js - 在 Node.js 中表达方法重写

javascript - Promise 解析器/拒绝器可以触发它的对立面吗?

javascript - parseFloat 函数没有按预期工作

node.js - socket.on ('connection' ... 事件从未触发 nodejs + express + socket.io

javascript - 为什么解析时sequelize Promise 的输出不同

javascript - 如何在 hapi.js 路由处理程序中将 mongodb 信息返回到浏览器?

javascript - axios请求: promise error UnhandledPromiseRejectionWarning after catch anyway