2013-06-16 25 views
30

Tôi không thể bắt ENOENT của fs.createReadStream(). Đây có phải là một chức năng không đồng bộ, mà ném ngoại lệ trong một chuỗi đóng cửa khác nhau?là ENOENT từ fs.createReadStream 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' 

Tôi hy vọng 'Bắt' được in chứ không phải là lỗi ngăn xếp!

Trả lời

43

fs.createReadStream không đồng bộ với kiểu trình phát sự kiện và không ném ngoại lệ (chỉ có ý nghĩa đối với mã đồng bộ). Thay vào đó nó sẽ phát ra một sự kiện lỗi.

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

Tôi đoán bạn đang nói đối tượng luồng được trả về đồng bộ, nhưng việc mở tệp của nó xảy ra không đồng bộ với phát xạ sự kiện. Không có cơ hội sự kiện lỗi nào được phát ra trước khi 'stream.on ('error', ...)' có hiệu lực không? Đó là những gì tôi thấy nếu tôi nhập vào nút REPL của một nút tại một thời điểm. –

+3

Có, bạn có thể yên tâm rằng dấu hiện tại sẽ hoàn tất trước khi xảy ra bất kỳ sự kiện nào. Vì vậy, miễn là bạn ràng buộc xử lý của bạn ngay lập tức, tất cả là tốt. –

+0

Hmm đó thực sự là hành vi khó hiểu! – UpTheCreek

Các vấn đề liên quan