console.log中的错误抛出顺序不正确?

时间:2018-03-24 22:27:40

标签: javascript

这里的代码是我实际所做的极其简化的版本,所以请不要试图在此搜索任何深层含义。我定义了这样的自定义错误。

function CustomError(message) {
  this.message = message;
  this.stack = (new Error()).stack;
}
CustomError.prototype = Object.create(Error.prototype);

接下来,我创建一个只有一个目的的简单函数,即抛出此错误。

function foo() {
  throw new CustomError('custom error message');
}

现在我创建一个下一个将进入无限循环的函数,检查是否有任何错误,一旦发现任何错误(除了自定义错误)之外就会中断(好吧,它应该但不会)。

function bar() {
  for (;;) {
    try {
      console.lg(foo());
    } catch (error) {
      if (error instanceof CustomError) {
        console.log(error);
      } else {
        throw new Error(error);
      }
    }
  }
}

bar();

console.lg(foo());的拼写中存在故意错误,该错误应该抛出不是CustomError实例的错误,从而导致达到导致崩溃的throw new Error(error);行该计划。

相反,执行foo()内的console.lg(foo());函数并抛出CustomError,循环将永远持续。

我有可能在这里犯了一个愚蠢的错误,但我不知道在哪里。所以我的问题是: 为什么console.lg();的内部在没有破坏程序的情况下到达,当它显然不是有效的代码?为什么在“非有效方法”错误之前抛出CustomError

2 个答案:

答案 0 :(得分:0)

使用解释器,在使用所述参数调用(尝试)调用其外部函数之前评估参数。在首先解析其参数的函数调用值之前,它不会查看外部函数调用的有效性。

答案 1 :(得分:0)

函数调用的工作方式as specifiedconsole.lg将评估为undefined。但是然后在之前评估参数,检查被调用的值是否实际上是一个可调用的函数。如果对参数的评估已经抛出异常(就像你的foo()那样),那么这个步骤甚至都不会发生。