【问题标题】:How to handle infinite loop error javascript如何处理无限循环错误javascript
【发布时间】:2021-11-21 15:18:31
【问题描述】:

我有一个自动创建的 JS 文件。我的模块调用它,有时自动创建的 JS 文件会导致无限循环。我会调用数千个自动创建的 JS 文件,有些会运行正确,但有些会导致无限循环,我不知道文件内容
==> 我想知道如何处理这个问题?
自动创建的 JS 文件示例。它命名为“excute.js”

const excuted = (a,b) => {
   let i = 0;
   while(a<b){
     i++;
   }
   console.log(i);
}

module.exports = excuted();

例如我的模块 ==> 我想在这里处理无限循环错误

const {exec} = require("child_process");

const check = () => {
  exec('node excute.js', (error, stdout, stderr) => {
    if(error) {
        console.log(error.message);
        return;
    }
    console.log(stdout);
  })
}

check();

我正在考虑在我的模块文件或自动创建的 JS 文件中使用 setTimeout。但我真的陷入困境和困惑!!!!谢谢大家

【问题讨论】:

  • excuted();
  • 只是等待一段时间,如果没有完成则终止进程?!
  • 您在executed 的什么地方更改了ab 的值?如果你不这样做,那么如果a&lt;b 一次为真,它将永远为真;您必须以某种方式更改函数 executed 中的参数值
  • @ASDFGerte 那是在谈论通用算法。在这种情况下,我们可以检查 a) 两个输入都是数字。 b) 两个输入不相等。完成。

标签: javascript error-handling infinite-loop child-process


【解决方案1】:

不可能确定性地检测另一个进程中的无限循环。在您的情况下,您可能只是想使该过程超时:

const {exec} = require("child_process");

async function check(fileName, timeOut = 1000) {
  return new Promise((resolve, reject) => {
    let _t = null;
    // Execute
    const process = exec(`node ${fileName}`, (error, stdout, stderr) => {
      if (_t) clearTimeout(_t);
      if (error) reject(error);
      else resolve(stdout);
    })
    // Time Out
    _t = setTimeout(() => {
      process.kill(-1);
      reject(undefined);
    }, timeOut);
  })
}

check()
  .then(stdout => console.log(stdout))
  .catch(console.error);

旁注

注意exec(),因为它正在您的服务器上执行代码。如果代码包含错误(如您的情况),则无法保证这些错误对您的系统来说不是致命的。此外,永远不要执行这样的不受信任的代码。

【讨论】:

  • 非常感谢!!!我知道。但是在我的模块中,我必须每小时调用数千个这样的文件。而且我无法更新创建文件的内容。这就是为什么我想这样处理它。我只是一个初学者。那你有什么解决办法。再次感谢你 !你救了我的命:3
  • @ĐìnhBình 建议的那个不行?我的意思是让进程超时不是解决方案?
  • 效果很好。我的意思是是否还有其他解决方案?
  • 您无法在有限的时间内确定程序是否会停止。 en.m.wikipedia.org/wiki/Halting_problem
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多