NodeJS:Promise不会捕获抛出异常

时间:2017-10-24 14:39:03

标签: node.js error-handling promise

我有这样的代码(简化):

getStreamFor(path) {
    // both, remote and local, return a Promise
    if(...) { return getRemoteFileStream(path); }
    else { return getLocalFileStream(path); }
}

getRemoteFileStream(path) {
    // should throw in my case (MyError)
    const validPath = validatePath(path); 
    return readStreamIfValid(validPath);
}

在测试案例中:

it('should throw MyError', () => {
    return getStreamFor(path)
        .then(() => {})
        .catch(error => expect(error).to.be.instanceOf(MyError));
});

问题是,当validatePath(path)方法抛出时(由于路径无效),测试用例承诺中没有任何内容被捕获。我的终端/控制台中的输出是一个常规的例外,好像它没有被捕获。

有没有人知道,为什么Promise不会认出投掷?我怎样才能解决这个问题,而不必考虑另一个"试试catch" (因为诺言应该为我做这件事)?

也许有一般的最佳实践如何构建Promise以避免像这样的错误吞噬?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

返回的承诺链的一部分

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

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

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