【问题标题】:Catching execSync erross捕获 execSync 错误
【发布时间】:2016-10-02 11:58:10
【问题描述】:

我正在使用execSync 运行soffice 命令。我遇到的问题是当抛出错误execSync 只是将错误记录到控制台,无法捕获它。我尝试使用 try catch 语句,但它仍然只是将错误记录到控制台。

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: 消息会自动记录,因为我没有记录。

【问题讨论】:

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

标签: javascript node.js exec


【解决方案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' })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2017-03-26
    • 2019-01-28
    • 1970-01-01
    • 2012-06-16
    • 2016-03-09
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多