2013-06-16 4 views
30

fs.createReadStream()のENOENTをキャッチできません。これは別のクロージャーチェーンで例外をスローする非同期関数ですか?はfs.createReadStreamのENOENTがuncatchableですか?

$ node -v 
v0.10.9 
$ cat a.js 
fs = require('fs') 

try { 
    x = fs.createReadStream('foo'); 
} catch (e) { 
    console.log("Caught"); 
} 

$ node a.js 

events.js:72 
     throw er; // Unhandled 'error' event 
      ^
Error: ENOENT, open 'foo' 

エラースタックではなく、「キャッチ」が印刷されることを期待しています。

答えて

43

fs.createReadStreamは、イベントエミッタスタイルと非同期であり、例外をスローしません(同期コードにのみ意味があります)。代わりにエラーイベントが発生します。

var fs = require('fs') 

var stream = fs.createReadStream('foo'); 
stream.on('error', function (error) {console.log("Caught", error);}); 
stream.on('readable', function() {stream.read();}); 
+3

ストリームオブジェクトが同期的に返されるとは思いますが、ファイルのオープンはイベントエミッションと非同期に発生します。 'stream.on( 'error'、...)'が有効になる前にエラーイベントが発生する可能性はありますか?これをノードのREPLに一度に1行ずつ入力すると、これが表示されます。 –

+3

はい、イベントが発生する前に現在のティックが完了することが保証されます。あなたがすぐにあなたのハンドラーを縛る限り、すべてがうまくいきます。 –

+0

これは本当に混乱している動作です! – UpTheCreek

関連する問題