gpt4 book ai didi

javascript - 如何使函数执行尝试/检查而不导致错误?

转载 作者:行者123 更新时间:2023-12-03 07:40:10 26 4
gpt4 key购买 nike

我有很多 try...catch 语句,用于处理传入 JSON 数据包可能在其他 JSON 可能没有数据的部分中的情况。为此,我通常执行以下操作:

var numberofitems;
try {
numberofitems = payload.data.form_values["b691"].length;
} catch (err) { numberofitems = 0; }

但是,在很多情况下,我可能会得到一个空值,这会扰乱我的代码。为了清理我的代码,我编写了一个函数来在一行中处理错误:

function checkTry(toCheck, errVal) {

try {
var result = toCheck;
} catch (err) {
result = errVal;
}
return result;
}

function datacheck() {

var data;

var result = checkTry(data.length, "0");
console.log(result);

}

datacheck();

然后我的例子变成如下:

var numberofitems = checkTry(payload.data.form_values["b691"].length,"0");

问题是 payload.data.form_values["b691"] 在我尝试将其传递到函数中时抛出错误,导致我最初试图捕获的错误。有什么办法可以解决这个问题吗?

我做了一个JS Bin snippet解决这个问题。

最佳答案

解决方案

使用默认值并完全放弃try...catch语句。异常应该确实是异常,是您不知道如何处理的异常(至少在简单的对象解构中没有 try...catch 的位置):

  1. var numberofitems = (payload.data.form_values.b691 || []).length;
  2. var numberofitems = ((payload.data.form_values || {}).b691 || []).length;
  3. var numberofitems = (((payload.data || {}).form_values || {}).b691 || []).length;
  4. var numberofitems = ((((payload || {}).data || {}).form_values || {}).b691 || []).length;

深入观察

该技术基于逻辑运算符的行为。对于逻辑 AND,如果左侧为 truthy ,它被返回,并且如果左侧是falsy,则右侧不被评估 ,返回右侧。对于逻辑“或”运算符,反之亦然。

由于 undefinednull 都是假的,并且对象始终为真,我们可以安全地假设,如果给定一个对象,则逻辑或将返回该对象,并且仅在没有提供对象的情况下才回退到评估我们的默认值。

请注意,该技术始终仅限于真值/假值。例如,以下内容在 value 所包含的内容方面是不确定的:

const indeterministicTest = () => {
const rand = Math.floor(Math.random() * 3);

const value = rand === 1 ?
null : rand ? true : false;

console.log( value || `The value is ${value}, and I am a fallback string!` );
}

let timeoutId = null;

function runIndefinitely (callback) {
timeoutId = setTimeout( () => {
callback();
runIndefinitely(callback);
}, 1e3);
}

const start = document.querySelector("#start");
start.addEventListener("click", () => {
runIndefinitely(indeterministicTest);
});

const end = document.querySelector("#end");
end.addEventListener("click", () => {
timeoutId && clearTimeout(timeoutId);
});
<button id="start" type="button">Start</button>
<button id="end" type="button">End</button>

关于javascript - 如何使函数执行尝试/检查而不导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62462565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com