对于传入的JSON数据包可能没有其他JSON的节中的数据的实例,我有很多try...catch语句。为此,我通常执行以下操作:

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在简单的对象解构中没有位置):

  • var numberofitems = (payload.data.form_values.b691 || []).length;
  • var numberofitems = ((payload.data.form_values || {}).b691 || []).length;
  • var numberofitems = (((payload.data || {}).form_values || {}).b691 || []).length;
  • var numberofitems = ((((payload || {}).data || {}).form_values || {}).b691 || []).length;

  • 深入了解

    该技术基于逻辑运算符的行为。对于逻辑AND,如果左侧为truthy,则返回该值,并且不评估右侧;如果左侧为falsy,则返回右侧。逻辑OR运算符的取反则成立。

    由于undefinednull都是虚假的,并且对象始终是真实的,因此我们可以放心地假设,如果给出了一个对象,则逻辑OR将返回该对象,并且仅在未提供任何对象的情况下才返回评估默认值。

    请注意,该技术仅限于始终为真/假的值。例如,就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>

    07-24 20:31