2016-11-17 17 views
3

私は非同期の滝を使用しています。関数の1つがコールバック(err)を呼び出すと、私のカスタム非同期コールバックが呼び出されます。そこにはエラーがスローされ、非同期のtryブロックで捕捉されることが期待されていますが、それは起こっていません。ノード非同期と例外処理

try { 
    async.waterfall([function1, function2], myAsyncCallback); 
} 
catch(err) { 
    console.log("THIS CODE IS NEVER EXECUTED."); 
} 

var function1 = function() { 
... 
    //some error occurs: 
    callback(new Error(errMsg), errMsg); 
... 
} 

var function2 = function() { 
... 
} 

function myAsyncCallback(err, result) { 
    console.log("This code gets executed."); 
    if (err) { 
      console.log("This code gets executed too."); 
      throw new Error("I want this error caught at the top around the catch around async.waterfall()"); 
     } 
} 
+0

コードは、問題をフォーマットする場所です。今、あなたはあなたの '' function1'の*内部myAsyncCallback' *を宣言するので、これは本当に賢明なコードではありません。これを減らして、人々がファイルにコピーして貼り付けて、ノードで実行して、表示されているのと同じものを見ることができます。 –

+0

@マイク、彼らは実際にはお互いの中にいません。サンプルを更新しましたので、うまくいけばそれは明らかになります。あなたは "..."を取り除いてテストすることができます。 – user994165

+0

私は答えを加えましたが、呼び出されている関数の詳細を知る必要があります。私はあなたの例のように見える私の作業コードを投稿しました! – clay

答えて

1

https://runkit.com/imjosh/async-try-catch/2.0.0

var async = require('async'); 

try { 
    async.waterfall([function1, function2], myAsyncCallback); 
} 
catch(err) { 
    errorHandler(err); 
} 

function function1(callback) { 
    console.log('in fn1') 
    callback(null,'fn1'); 
} 

function function2(fn1, callback) { 
    console.log('in fn2') 
    callback(null, fn1 + 'fn2'); 
} 

function myAsyncCallback(err, result) { 
    if (err) { 
     console.error('There was an error: ' + err); 
     return; 
    } 
    //an error occurs. this gets caught by the outer try block 
    //var foo = outer; //oops, outer is not defined. This throws an error 

    //same scenario but inside an async function 
    //can't/won't be caught by the outer try block 
    setTimeout(function(){ 
     try{ //need try here 
      var foo = inner; //oops, inner is not defined. This throws an error 
     } 
     catch(err) { 
      errorHandler(err); 
     } 
    }, 1000); 

    console.log('Result was: ' + result); 
} 

function errorHandler(err){ 
    //Make error handler a function that can be called from either catch 
    console.log('caught error: ' + err); 
} 
+0

私はmyAsyncCallbackを呼び出したasyncモジュールコールバックでエラーが発生します。 function1の内部のエラーは、最初のtry/catchブロックで捕捉されますが、それは私がやろうとしていることではありません。 – user994165

+0

私は答えを編集しました。すべてのエラー処理は1か所にあります。 myAsyncCallback内の例外が処理されます。あなたの実際のコードを見ることなくあなたがしようとしていることを見るのは非常に難しいです。 – imjosh

0

私のために働きます。相違点がありますか?何かもっと光が出たら私の答えを更新します。

これは私の出力である:それは非同期の周りにtryブロックでキャッチすることを望ん

var async = require('async') 
try { 
    async.waterfall([function1, function2], myAsyncCallback); 
} 
catch(err) { 
    console.log("THIS CODE IS NEVER EXECUTED."); 
} 

function function1(callback) { 
    console.log("inside function1"); 
    var errMsg = "Uh oh"; 
    callback(new Error(errMsg), errMsg); 
} 

function function2(stuff2, callback) { 
    console.log('inside function2'); 
    var errMsg = "Uh oh"; 
    callback(new Error(errMsg), errMsg); 
} 

function myAsyncCallback(err, result) { 
    console.log("This code gets executed."); 
    if (err) { 
      console.log("This code gets executed too."); 
      throw new Error("I want this error caught at the top around the catch around async.waterfall()"); 
     } 
    console.log(result); 
} 
+0

あなたの 'function1'と' function2'はコールバックを同期して呼び出していますが、意味がありません。 'myAsyncCallback'は*非同期*コールバックでなければなりません。さもなければasync.waterfallが最初に使われていなかったでしょう。 – Bergi

+0

Bergi、私は各機能(例えば、https://www.hacksparrow.com/node-js-async-programming.html)でコールバックを呼び出すと考えられます。通常の非同期処理を同期させることができます。たぶん私は何かを見逃しています。 – user994165

+0

@Clay、あなたのサンプルは私のために働いた。私のコードでエラー処理をテストするために、私はコールバックにthrow文を追加しましたが、エラーを作成せずにコールバックに送信しました:callback(err)。私のコードでは、上記の "..."の代わりにif/elseがあり、コールバックコールが実行されないようにしました。 – user994165

1

が、それは

が起こっていない:

このコードの
[Clays-MacBook-Pro ~/Documents/workspace/scratch]:node index.js 
inside function1 
This code gets executed. 
This code gets executed too. 
THIS CODE IS NEVER EXECUTED. 
[Clays-MacBook-Pro ~/Documents/workspace/scratch]:node -v 
v6.9.1 
[Clays-MacBook-Pro ~/Documents/workspace/scratch]: 

それは不可能です。エラーは、async.waterfallが返され、tryブロックが残った後に、長い間、非同期的に作成され、スローされます。非同期エラーを処理したい場合は、myAsyncCallbackで行います(既に行っているように)。決してthrowを非同期コールバックで使用しないでください。

+0

これは正確ではありません。 'async.waterfall'が呼び出されたときに作成されたスコープは、チェーンが終了するまで残っています。スローされたエラーは、コールチェーンを介して「バブルアップ」します。私は、非同期コールバックを投げることは問題があることに同意するだろう。なぜなら、それはエラーをトレースするのに苦痛だからだ。しかし不可能ではない。この回答を編集できますか? – clay

+0

@clayあなたはどの範囲を話していますか? OPコードにはクロージャはありません。そのため、スコープは残されたときに破棄されます。それともチェーンが死ぬまで何を意味するのですか? OPsコードでスローされる 'myAsyncCallback'が' async.waterfall'によって呼び出されないことに注目してください - それは*非同期です*。 – Bergi

+0

私はコールバックチェーンを意味すると思います。しかし、あなたが正しいです、コールバックが非同期的に呼ばれるかどうかは異なる動作があります。私はいくつかの勉強をしている、私は推測する!ご回答有難うございます。 – clay

関連する問題