为什么 try-catch 块不捕获 child_process 由于 Node.js 中的无效可执行路径而产生的异常?

Why does not a try-catch block catch a child_process spawn exception due to invalid executable path in Node.js?

const { spawn } = require("child_process")

try{
    spawn("invalid/path/to/executable")
}catch(err){
    console.log("exception: ",err)
}

此代码引发错误,程序停止执行。它从不打印 exception: 所以 catch 块不会被执行:

events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: spawn invalid/path/to/executable ENOENT

当 运行 具有可执行文件的有效路径时,相同的代码有效。

由于ENOENT错误导致spawn失败怎么办?

此模块触发 error 事件,您只需为其添加一个侦听器即可。 您可以阅读更多相关信息 here

因此,您可以将代码转换为:

const {spawn} = require("child_process")

const subprocess = spawn("invalid/path/to/executable")
subprocess.on('error', function (err) {
  console.log('Failed to start subprocess: ' + err);
});

此外,我建议阅读 Samer Buna 的这篇 article。他介绍了很多关于这个模块的有趣话题。