1. ホーム
  2. javascript

[解決済み] プロミスキャッチの再投入エラー

2022-10-20 18:06:26

質問

チュートリアルで次のようなコードを見つけました。

promise.then(function(result){
    //some code
}).catch(function(error) {
    throw(error);
});

私は少し混乱しています。catch呼び出しは何かを達成するのでしょうか?単にキャッチされたのと同じエラーを投げるだけなので、何の効果もないように思えます。私はこれを、通常の try/catch がどのように動作するかに基づいています。

どのように解決するのですか?

あなたが示すように、裸のキャッチ&スローに意味はありません。 コードを追加して実行を遅くする以外、何の役にも立ちません。 ですから、もしあなたが .catch() で再スローするのであれば、何かやりたいことがあるはずです。 .catch() でやりたいことがあるはずで、そうでなければ .catch() を完全に削除してください。

その一般的な構造の通常のポイントは、何かを実行したいときに .catch() で何かを実行したいときです。例えば、エラーを記録したり、状態をクリーンアップしたり(ファイルを閉じたり)しますが、プロミスチェーンは拒否されたまま継続させたいときです。

promise.then(function(result){
    //some code
}).catch(function(error) {
    // log and rethrow 
    console.log(error);
    throw error;
});

チュートリアルでは、エラーをキャッチできる場所を示すため、あるいはエラーを処理してから投げ直すという概念を教えるためだけに存在することがあります。


キャッチと再スローの有用な理由のいくつかは次のとおりです。

  1. 次のことをしたい エラーを記録する を記録し、プロミス・チェーンは拒否されたままにしておきたい。
  2. あなたは エラーを他のエラーに変える に変えたい (多くの場合、連鎖の末端でのエラー処理を容易にするため)。 この場合、別のエラーを再投与することになります。
  3. あなたは プロミス・チェーンが続く前に多くの処理を行いたい。 (リソースのクローズや解放など) を行いたいが、プロミス・チェーンは拒否されたままにしておきたい。
  4. あなたは デバッガのためにブレークポイントを置く場所。 が必要です。
  5. あなたは 特定のエラーまたはエラーのセットを処理したい を処理し、他のエラーは呼び出し元に伝搬するように再スローしたい。

しかし、キャッチハンドラ内に他のコードがない、同じエラーのプレーンなキャッチと再スローは、コードの正常な実行に役立つことは何もありません。