簡體   English   中英

在 JavaScript 中嘗試 {} 而不捕獲 {} 可能嗎?

[英]try {} without catch {} possible in JavaScript?

我有許多函數要么返回一些東西要么拋出一個錯誤。 在主函數中,我調用了其中的每一個,並希望返回每個函數返回的值,或者如果第一個函數拋出錯誤,則繼續執行第二個函數。

所以基本上我目前擁有的是:

function testAll() {
    try { return func1(); } catch(e) {}
    try { return func2(); } catch(e) {} // If func1 throws error, try func2
    try { return func3(); } catch(e) {} // If func2 throws error, try func3
}

但實際上我只想try返回它(即,如果它沒有拋出錯誤)。 我不需要catch塊。 但是,像try {}這樣的代碼會失敗,因為它缺少(未使用的) catch {}塊。

在 jsFiddle 上舉了一個例子

那么,有什么方法可以在達到相同效果的同時移除這些catch塊?

沒有catch子句的try將其錯誤發送到下一個更高的catch或窗口,如果在該 try 中沒有定義 catch。

如果您沒有catch ,則 try 表達式需要finally子句。

try {
    // whatever;
} finally {
    // always runs
}

ES2019開始,可以有一個空的 catch 塊,沒有錯誤變量。 這稱為可選的 catch 綁定,並在 2018 年 6 月發布的 V8 v6.6中實現。 該功能從Node 10Chrome 66Firefox 58Opera 53Safari 11.1開始可用。

語法如下所示:

 try { throw new Error("This won't show anything"); } catch { };

你仍然需要一個catch塊,但它可以是空的,你不需要傳遞任何變量。 如果您根本不需要 catch 塊,則可以使用try / finally ,但請注意,它不會像空 catch 那樣吞下錯誤。

 try { throw new Error("This WILL get logged"); } finally { console.log("This syntax does not swallow errors"); }

不, catch (或finally )是try的朋友,並且始終作為try/catch 的一部分存在。

但是,讓它們為空是完全有效的,就像在您的示例中一樣。

在您的示例代碼的注釋中(如果 func1 拋出錯誤,請嘗試 func2 ),看起來您真正想要做的是調用前一個catch塊內的下一個函數。

我不推薦沒有 catch 的 try-finally,因為如果 try 塊和 finally 塊都拋出錯誤,finally 子句中拋出的錯誤就會冒泡,並且在我自己的測試中忽略 try 塊的錯誤:

try {
  console.log('about to error, guys!');
  throw new Error('eat me!');
} finally {
  console.log ('finally, who cares');
  throw new Error('finally error');
}

結果:

>     about to error, guys!
>     finally, who cares
>     .../error.js:9
>         throw new Error('finally error');
>         ^
>     
>     Error: finally error

不,不可能在沒有catch (或finally )的情況下使用try塊。 作為一種解決方法,我相信您可能想要定義一個輔助函數,例如:

function tryIt(fn, ...args) {
    try {
        return fn(...args);
    } catch {}
}

並使用它:

tryIt(function1, /* args if any */);
tryIt(function2, /* args if any */);

我決定從不同的角度看待這個問題。

我已經能夠確定一種方法來密切允許所請求的代碼模式,同時部分解決另一個評論者列出的未處理的錯誤對象。

代碼可見@http://jsfiddle.net/Abyssoft/RC7Nw/4/

try:catch 被放置在一個 for 循環中,允許優雅地通過。 同時能夠遍歷所需的所有功能。 當需要顯式錯誤處理時,使用額外的函數數組。 即使錯誤和帶有錯誤處理程序元素的函數數組不是函數,錯誤也會轉儲到控制台。

這里根據stackoverflow的要求是內聯代碼[編輯以使JSLint兼容(刪除前導空格以確認),提高可讀性]

function func1() {"use strict"; throw "I don't return anything"; }
function func2() {"use strict"; return 123; }
function func3() {"use strict"; throw "I don't return anything"; }

// ctr = Code to Run <array>, values = values <array>, 
// eh = error code can be blank.
// ctr and params should match 1 <-> 1
// Data validation not done here simple POC
function testAll(ctr, values, eh) {
    "use strict";
    var cb; // cb = code block counter
    for (cb in ctr) {
        if (ctr.hasOwnProperty(cb)) {
            try {
                return ctr[cb](values[cb]);
            } catch (e) {
                if (typeof eh[cb] === "function") {
                    eh[cb](e);
                } else {
                    //error intentionally/accidentially ignored
                    console.log(e);
                }
            }
        }
    }
    return false;
}

window.alert(testAll([func1, func2, func3], [], []));

如果您只想在發生錯誤時觸發函數 2 和 3,為什么不將它們放入 catch 塊中?

function testAll() {
  try {
    return func1();
  } catch(e) {
    try {
      return func2();
    } catch(e) {
      try {
        return func3();
      } catch(e) {
        // LOG EVERYTHING FAILED
      }
    }
  }
}

...is there any way to have those catch blocks removed whilst achieving the same effect? 看起來,沒有 Javascript 要求 try 塊后跟 catch 或 finally 塊。

to achieve the effect you want.話雖如此,有一種方法可以來實現您想要的效果。

condition, is what the catch block is for. // If func1 throws error, try func2 條件,就是 catch 塊的作用。

當它們的使用正是您所追求的時,為什么要刪除它們?

try { return func1(); }
catch {
   // if func1 throws error
   try { return func2(); } 
   catch {
      // if func2 throws error
      try { return func3(); } 
      catch {
         // if func3 throws error
      }
   }
}

我完全理解為什么您可能不需要 catch 塊,並且會發現能夠完全省略它會更干凈。 但我不認為這是其中一種情況。

它們以我所知道的每種語言(JavaScript、Java、C#、C++)一起使用。 不要這樣做。

try & catch 就像一枚硬幣的兩面。 所以沒有嘗試是不可能的。

ES2019 開始,您可以輕松使用try {}而無需catch {}

try {
  parseResult = JSON.parse(potentiallyMalformedJSON);
} catch (unused) {}

有關更多信息,請參閱Michael Ficcara 的建議

不,你必須保留它們。

這實際上是有道理的,因為根本不應該默默地忽略錯誤。

暫無
暫無

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

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