捕获 execSync 错误

Catching execSync errors

提问人:Rodrigo 提问时间:6/3/2016 最后编辑:CheesoRodrigo 更新时间:11/16/2022 访问量:5105

问:

我用来运行命令。我遇到的问题是,当抛出错误时,只需将错误记录到控制台,就无法捕获它。我尝试使用语句,但它仍然只是将错误记录到控制台。execSyncsofficeexecSynctrycatch

function convertToPdf(filepath, destpath) {
  var cmd = 'sofice command';

  try {
    var res = execSync(cmd, { encoding: 'utf8' });
  } catch (e) {
    console.log("Errors:", e);
  } 

  console.log("res:", res);
}

convertToPdf("test.docx");

我运行这个并把它拿回来:

Error: source file could not be loaded
res:

请注意,即使明确抛出了一个错误,我的 catch 语句也从未被记录下来,但另一条消息会自动被记录下来,因为我没有记录它。Error:

JavaScript 节点.js exec

评论

0赞 Álvaro González 6/3/2016
手册上说“它抛出”,但仅限于某些条件:“如果进程超时,或者有一个非零退出代码”。你有这些吗?
0赞 Rodrigo 6/3/2016
@ÁlvaroGonzález 我怎么知道我什至无法检查退出代码。它所做的只是记录以筛选我上面发布的内容
0赞 Álvaro González 6/6/2016
我不是 Node 专家,但文档建议(进程超时):如果它没有抛出错误,则为零,否则为非零(您可以从错误中读取状态)。由于 LibreOffice 的 soffice(假设您的意思是)是一个 GUI 程序,我不会对它不会在错误时返回非零代码感到惊讶。在大多数 shell 中,这应该很容易测试。如果你告诉我们你有什么shell,我们可能会告诉你如何从控制台读取返回值。如果你告诉我们确切的命令和你得到的错误,我们甚至可以自己重现它。soffice
0赞 Kartik Watwani 8/4/2021
你是如何解决这个问题@Rodrigo?

答:

1赞 Shiftj 12/3/2021 #1

试试这个:

function myExecSync(command, trim = true, cwd = pwd, opts = {}) {
  const ret = execSync(command, { cwd, ...opts }).toString('utf-8');
  return trim ? ret.trim() : ret;
}

并手动编写 stdio: 'pipe' 以防止 childprocess.stderr 输出到控制台。喜欢

myExecSync(command, true, cwd, { stdio: 'pipe' })

评论

0赞 DavidDr90 2/21/2022
我不认为这个解决方案会奏效......调用时会抛出异常,并且代码不会到达 return 语句execSync