如何处理多个错误然后捕获javascript承诺的错误?

时间:2017-09-11 16:38:23

标签: javascript error-handling ecmascript-6 promise bluebird

让p成为我们可以做的承诺

p
.then(f1)
.then(f2)
.then(f3)
.catch(f4)

现在处于catch状态,可以从f1,f2,f3或者p中的任何一个中抛出错误

现在应该是处理f4(或catch中)错误的正确方法,因为上面抛出的错误可能是不同的类型,如果在f4中可以避免多个 ?

3 个答案:

答案 0 :(得分:2)

您可以定义自己的自定义错误。例如:

function CustomError(errorText){
    this.error = errorText;
}

修改你的功能。为函数返回的每个Promise添加catch块:

function p(){
    return new Promise(function(resolve, reject){ 
            //Your functionality here
         })
          .catch(function(error){
             Promise.reject(new CustomError('f1')));
         })
}

依此类推:f2,f3,f4

你的捕获区将是:

.catch((err) => {
    if(err instanceof CustomError){
        HandleCustomError(err);
    } else {
        //Some another error is happen
    }
 })

你自定义错误处理程序将是这样的:

function HandleCustomError(customError){
     switch(customError.error){
         case 'f1':
            //handle f1
            break;
         case 'f2':
            //handle f2
            break;
         ...
     }
}

答案 1 :(得分:0)

只需定义一个额外的catch回调:

p
.then(f1)
.then(f2)
.then(f3)
.catch(err => {
  if (/* is expected error */) {
    console.log(err);
    return;
  }
  throw new Error('Unexpected error');
})
.catch(err => ...)

答案 2 :(得分:0)

通过在被拒绝的Promise中捕获错误,您不必担心最终catch块中的错误类型不同,并且您的代码应更具可读性(从某种意义上来说,更容易看到每个catch块可以处理适当的拒绝)。

如果您有可能,我还建议您使用async / await。 在此语法中,被拒绝的承诺等同于抛出的错误。 而不是使用大量链接的Promises,“将每个catch块放置在正确的位置”的逻辑更加直接,并且应该使错误更容易被发现。

YEAR   MONTH  amount
2017   6      296.00
2017   7      0
2017   8      0
2017   9      0
2017   10     0
2017   11     0
2017   12     0
2018   1      131.00
2018   2      154.00
2018   3      441.00
etc.