2017-10-24 23 views
0

私はこのようなコード(簡体字)があります。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"(おそらく私のためにする必要があるので)で囲むことなく、どうすれば修正できますか?

おそらく、これらのようなエラーの嚥下を避けるために約束を構築する方法がありますか?

ありがとうございました!

+0

「*リモートとローカルの両方がプロミスを返す」と言っていますが、「getRemoteFileStream」「*はスローする必要があります」と言います。それは約束を返さない。 – Bergi

+0

ええ、それは私が処理されることを期待していた例外を投げ、周囲の約束によって "拒絶"とされました。 – jlang

+0

さて、問題は、あなたのコード内で*呼び出しを囲むという約束はないということです:-)あなたは 'async関数 'にすることで簡単に導入することができます。 – Bergi

答えて

0

ここでの問題はvalidatePath()getRemoteFileStream()

一つの可能​​な解決策で返さ約束チェーンの一部は以下の通りであるではないということです。

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

validatePath()によってスローされた例外は、現在の約束の中で処理されますcatchハンドラ。

+0

ありがとう!これは私が探していたものです!もう少し疑問ですが、最初の 'then'部分から2つ以上の変数がある場合、それは2番目の' then'部分で必要とされます - これを扱う良い方法もありますか? – jlang

+0

Simpler: 'Promise.resolve(path).then(validatePath).then(readStreamIfValid)' – Bergi

+0

@jlang「複数の変数」とはどういう意味ですか?関数は単一の値だけを返すことができます。 – Bergi

関連する問題