[英]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 {}
塊。
那么,有什么方法可以在達到相同效果的同時移除這些catch
塊?
沒有catch子句的try將其錯誤發送到下一個更高的catch或窗口,如果在該 try 中沒有定義 catch。
如果您沒有catch ,則 try 表達式需要finally子句。
try {
// whatever;
} finally {
// always runs
}
從ES2019開始,可以有一個空的 catch 塊,沒有錯誤變量。 這稱為可選的 catch 綁定,並在 2018 年 6 月發布的 V8 v6.6中實現。 該功能從Node 10 、 Chrome 66 、 Firefox 58 、 Opera 53和Safari 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.