簡體   English   中英

console.log內部錯誤的錯誤拋出順序?

[英]Incorrect error throw order inside of console.log?

這里的代碼是我實際上正在做的極其簡化的版本,請不要嘗試在其中尋找任何深層含義。 我定義這樣的自定義錯誤。

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());拼寫存在故意錯誤console.lg(foo()); 這應該拋出不是CustomError實例的throw new Error(error); ,從而throw new Error(error); CustomError 行將導致程序崩潰。

而是在console.lg(foo());內部的foo()函數console.lg(foo()); 執行並拋出CustomError ,循環將永遠繼續。

我有可能在這里犯一個愚蠢的錯誤,但是我看不到哪里。 所以我的問題是:為什么console.lg();的內部console.lg(); 顯然不是有效的代碼時卻未破壞程序而達到? 為何在“無效方法”錯誤之前引發CustomError

使用解釋器,對參數進行評估,然后再調用它們的外部函數(嘗試將其調用)。 在將其參數的函數調用首先解析為值之前,它不會查看外部函數調用的有效性。

這就是函數調用按指定方式工作的方式 console.lg將被評估為undefined 但是然后在檢查調用的值是否實際上是可調用函數之前 ,將對參數進行求值。 如果對參數的求值已引發異常(如foo()一樣),則該步驟甚至不會發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM