承诺处理错误

问题描述:

如何处理自己生成的错误以及Javascript承诺中的库/未处理的异常?我面临的问题是由承诺方法的“全部”性质产生的。承诺处理错误

举例来说,我有以下代码:

somePromiseFunction() 
.then(result => { 
    // External library or behaviour 
    someCodeThatCanThrowExceptions() 

    if (result.code === 1) { 
     throw 'My own exception' 
    } 
}) 
.catch(err => { 
    // how do I know if this is an exception I don't know or something 
    // that I do want to actually handle? 
}); 

很多事情都可能出错的then()链,外部库可以抛出异常等。例如,当这样的事情发生时,我想打印“通用错误”。

但我也想验证代码并提前退出(就像我在这个例子中做的那样),并且在这种情况下实际上打印了我自己的消息“我自己的错误”。

如何处理我的“退出早期”throw s和所有不同的事情,而不是在执行代码期间可能出错?

+1

让.catch中的代码检查'if(err ==='我自己的异常')'后面跟着你的自定义处理程序,其次是一般处理程序吗? –

+0

不要宣传[此图书馆](https://github.com/AlexanderMac/n-custom-errors),但它可以满足你的需求。给出了注册自定义错误的可能性,并检查抛出的错误是否是自定义错误。 – alexmac

+0

[永远不会抛出字符串。](https://stackoverflow.com/a/26020867/1048572) – Bergi

在你的具体情况下,你抛出一个简单的字符串异常,所以你必须看看值。

function go() { 
    return new Promise(function(resolve, reject) { 
    throw 'My Exception'; 
    }); 
} 

const x = go() 
    .then(function() { 

    }) 
    .catch(function(ex) { 
    if (ex === 'My Exception') { 
     alert('It was mine'); 
    } 
    }); 

如果您创建更多特殊的例外,您可以测试类型,而不是确切的字符串。下面是与下面的window.Error图案(即,它具有一个名字和一个消息)可被型测试的异常的例子:

var MyError = (function() { 
    function MyError(message) { 
    this.message = message; 
    this.name = 'MyError'; 
    } 
    return MyError; 
}()); 

function go() { 
    return new Promise(function(resolve, reject) { 
    throw new MyError('Something went wrong'); 
    }); 
} 

const x = go() 
    .then(function() { 

    }) 
    .catch(function(ex) { 
    if (ex instanceof MyError) { 
     alert('It was mine'); 
    } 
    }); 

这具有从测试去耦邮件的益处以确定它是否是你的错误与否。