【问题标题】:is ENOENT from fs.createReadStream uncatchable?来自 fs.createReadStream 的 ENOENT 是不可捕获的吗?
【发布时间】:2013-06-16 18:49:57
【问题描述】:

我无法捕获 fs.createReadStream() 的 ENOENT。这是一个异步函数,它在不同的闭包链中抛出异常吗?

$ 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'

我希望打印 'Caught' 而不是错误堆栈!

【问题讨论】:

    标签: node.js


    【解决方案1】:

    fs.createReadStream 与事件发射器样式是异步的,并且不会抛出异常(这只对同步代码有意义)。相反,它会发出一个错误事件。

    const fs = require('fs')
    
    const stream = fs.createReadStream('foo');
    stream.on('error', function (error) {console.log("Caught", error);});
    stream.on('ready', function () {stream.read();});
    

    【讨论】:

    • 我猜你是说流对象是同步返回的,但是它的文件的打开与事件发射是异步发生的。在stream.on('error', ...) 生效之前没有机会发出错误事件吗?如果我一次将它输入到节点的 REPL 中,这就是我看到的。
    • 是的,您可以放心,当前的刻度将在任何事件触发之前完成。因此,只要您立即绑定处理程序,一切都很好。
    • 嗯,这真是令人困惑的行为!
    • 谢谢。很有帮助。为什么我在任何地方的文档中都看不到这个? (我假设我以某种基本方式误读了文档)
    • 文档描述了来自 ReadableStream hereerror 事件。您可能很难找到它,因为您必须从 createReadStream 文档开始,然后单击链接导航到 ReadableStream 以查找有关所发出事件的详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    相关资源
    最近更新 更多