2017-02-10 5 views
17

私は、チュートリアルでは、次のコードが見つかりました:私は少し混乱してい再スローエラー

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

を:キャッチコールは何も達成していますか?捕まえられたのと同じエラーが投げられるだけなので、何の効果もないようです。私は定期的なtry/catchの仕組みに基づいています。

+0

、チュートリアルへのリンクを提供してもらえますか?おそらく、役に立つかもしれない追加の文脈があります。 – Igor

+0

@Igor私はPluralsightにありません。これはおそらくエラーを渡すエラーの単なるプレースホルダですか? –

+0

これは、何もしないので、最初にキャッチを持たないことで達成できる呼び出し元にエラーを渡すことはないと思います。 – Igor

答えて

23

裸のキャッチとスローにはポイントがありません。コードを追加して実行を遅らせること以外は何も役に立ちません。だから、.catch()に行って再挑戦する場合は、.catch()に何かしたいことがあります。そうしないと、.catch()を完全に削除するだけです。

一般的な構造の通常のポイントは、エラーをログに記録したり、いくつかの状態(クローズファイルなど)をクリーンアップするなど、.catch()で何かを実行したいときです。

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

はチュートリアルでは、それは彼らがエラーをキャッチすることができたり、その後、エラーを処理し、それを再スローの概念を教えるために人々を表示するだけがあるかもしれません。

+0

私の意見からは、NOE \トン良い例です。このようなアプローチでは、1つのエラーに対する複数のロギングを簡単に取得できます。 Javaでは、単に新しい例外(periousException)をスローすることができます; '私はJavaScriptがネストされたエラーをサポートするかどうかわかりませんが、とにかく"ログとスロー "は悪い習慣です。 – Cherry

+4

@Cherry - これは一般的に悪い習慣であるとは言えません。モジュールがそれ自身の方法で独自のエラーを記録することが必要な時があります。これがその方法の1つです。また、私はこれを推薦していないよ、私はちょうど '' .catchを() '持っていて、' .catchで何かを()を実行しない限り、キャッチの内側に同じエラーをスローする理由がないことを説明しています。それがこの答えの要点です。 – jfriend00

2

あなたの質問のように聞こえます。 'promise chainでは、.catch()メソッドは何をしますか?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw

throw文は「(投げの後のステートメントは実行されません)を停止し、制御が呼び出しスタック内の最初のcatchブロックに渡されます。何のcatchブロックは、発信者の機能の中で存在しない場合、プログラムは終了します。

promiseチェーンでは、.then()メソッドが何らかのタイプのデータチャンクを返します。このチャンクの復帰は約束を完了させるでしょう。成功したデータの復帰は約束を完了させる。同じ方法で.catch()メソッドを考えることができます。 .catch()は失敗したデータ取得を処理します。 throw文は約束を完了します。 Ocassionalyでは、開発者はpromise chainを完成させる.catch((err)=> {console.log(err)}}を使用するでしょう。

3

catchメソッド呼び出しを完全に削除しても重要な違いはありません。

追加する唯一のことは実際にはcatch句がないと失敗した約束の場合よりも、約束の拒否に気付くことを意味します。

次のスニペットはこのことを示しています。

var p; 
 
// Case 1: with catch 
 
p = Promise.reject('my error 1') 
 
     .catch(function(error) { 
 
      throw(error); 
 
     }); 
 

 
p.catch(error => console.log(error)); 
 
// Case 2: without catch 
 
p = Promise.reject('my error 2'); 
 

 
p.catch(error => console.log(error));

は、第二の拒絶が最初に前に報告されているかに注意してください。それは唯一の違いです。

+0

スニペットがうまく機能します。しかし、サービスは現在利用できません..ですチェック:http://meta.stackoverflow.com/a/337257/747579 –

2

.then().catch()のいずれのメソッドもプロミスを返し、どちらのハンドラでも例外をスローすると、返された約束は拒否され、例外は次の拒否ハンドラで捕捉されます。次のコードで

、我々は、第二.catch()に捕捉される最初.catch()に例外をスロー:

new Promise((resolve, reject) => { 
 
    console.log('Initial'); 
 

 
    resolve(); 
 
}) 
 
.then(() => { 
 
    throw new Error('Something failed'); 
 
     
 
    console.log('Do this'); // Never reached 
 
}) 
 
.catch(() => { 
 
    console.log('Something failed'); 
 
    throw new Error('Something failed again'); 
 
}) 
 
.catch((error) => { 
 
    console.log('Final error : ', error.message); 
 
});

.catch()リターンはそれが満たされる約束、 .then()ハンドラを呼び出すことができます:

new Promise((resolve, reject) => { 
 
    console.log('Initial'); 
 

 
    resolve(); 
 
}) 
 
.then(() => { 
 
    throw new Error('Something failed'); 
 
     
 
    console.log('Do this'); // Never reached 
 
}) 
 
.catch(() => { 
 
    console.log('Something failed'); 
 
    throw new Error('Something failed again'); 
 
}) 
 
.catch((error) => { 
 
    console.log('Final error : ', error.message); 
 
}) 
 
.then(() => { 
 
    console.log('Show this message whatever happened before'); 
 
});

便利な参照:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Chaining_after_a_catch

は、この情報がお役に立てば幸い!

関連する問題