Node.js NodeJS:赢得承诺';无法捕获抛出的异常

Node.js NodeJS:赢得承诺';无法捕获抛出的异常,node.js,error-handling,promise,Node.js,Error Handling,Promise,我有这样一个代码(简化): 在测试用例中: it('should throw MyError', () => { return getStreamFor(path) .then(() => {}) .catch(error => expect(error).to.be.instanceOf(MyError)); }); 问题是,当validatePath(path)方法抛出时(由于路径无效),测试用例中不会捕获任何内容。我的终端/控制台

我有这样一个代码(简化):

在测试用例中:

it('should throw MyError', () => {
    return getStreamFor(path)
        .then(() => {})
        .catch(error => expect(error).to.be.instanceOf(MyError));
});
问题是,当
validatePath(path)
方法抛出时(由于路径无效),测试用例中不会捕获任何内容。我的终端/控制台中的输出是一个常规异常,就好像它是未捕获的一样

有没有人有主意,为什么承诺不承认这一扔?我怎样才能修复它,而不可能在测试用例中使用另一个“try-catch”来包围调用(既然promise应该为我这样做)

也许有一个通用的最佳实践是如何构建承诺,以避免像这样的错误吞咽


谢谢你的帮助

这里的问题是
validatePath()
不是
getRemoteFileStream()

一种可能的解决方案如下:

getRemoteFileStream(path) {
    return Promise.resolve()
        .then(() => validatePath(path))
        .then(validPath => readStreamIfValid(validPath));
}

validatePath()
引发的异常现在将在Promise的捕获处理程序中处理。

这里的问题是
validatePath()
不是
getRemoteFileStream()返回的Promise链的一部分。

一种可能的解决方案如下:

getRemoteFileStream(path) {
    return Promise.resolve()
        .then(() => validatePath(path))
        .then(validPath => readStreamIfValid(validPath));
}

validatePath()
引发的异常现在将在Promise的捕获处理程序中处理。

谢谢!这就是我一直在寻找的!不过,有一个小问题:当第一个
然后是
-部分中有多个变量时,第二个
然后是
-部分中需要多个变量时,是否也有一个好方法来处理这个问题?更简单的是:
Promise.resolve(path)。然后(validatePath)。然后(readStreamIfValid)
@jlang“多个变量”是什么意思?一个函数只能返回一个值。谢谢!这就是我一直在寻找的!不过,有一个小问题:当第一个
然后是
-部分中有多个变量时,第二个
然后是
-部分中需要多个变量时,是否也有一个好方法来处理这个问题?更简单的是:
Promise.resolve(path)。然后(validatePath)。然后(readStreamIfValid)
@jlang“多个变量”是什么意思?一个函数只能返回一个值。你说“远程和本地都返回一个承诺”,但你说
getRemoteFileStream
“应该抛出”。这不是回复承诺。是的,它抛出了一个例外,我希望被周围的承诺处理和转发为“拒绝”。这是,问题在于,代码中的调用没有承诺:-)通过将其设置为
异步函数,您可以很容易地引入一个。您说“远程和本地都返回一个承诺”,但随后您说
getRemoteFileStream
“应该抛出”。这并不是在返回承诺。是的,它抛出了一个异常,我希望被周围的承诺处理并转发为“拒绝”。问题是,代码中的调用没有承诺:-)您可以通过将其设置为
异步函数来轻松引入一个。