私はこのようなコード(簡体字)があります。NodeJS:約束がスローされた例外をキャッチしません
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)
、ありますメソッドがスローされる(無効なパスのため)、何もテストケースの約束に捕まらない。私の端末/コンソールの出力は、それが捕らえられていないかのように通常の例外です。
誰もが、なぜプロミスが投げを認識しないのでしょうか?テストケースのコールを別の "try catch"(おそらく私のためにする必要があるので)で囲むことなく、どうすれば修正できますか?
おそらく、これらのようなエラーの嚥下を避けるために約束を構築する方法がありますか?
ありがとうございました!
「*リモートとローカルの両方がプロミスを返す」と言っていますが、「getRemoteFileStream」「*はスローする必要があります」と言います。それは約束を返さない。 – Bergi
ええ、それは私が処理されることを期待していた例外を投げ、周囲の約束によって "拒絶"とされました。 – jlang
さて、問題は、あなたのコード内で*呼び出しを囲むという約束はないということです:-)あなたは 'async関数 'にすることで簡単に導入することができます。 – Bergi