正确或标准的方式写非 - 终止'码?

时间:2016-10-26 22:13:43

标签: javascript

道歉,但我不确定我所问的是什么术语。

我所指的是当一些代码失败并阻止任何进一步的代码执行时 当代码的chucks彼此不依赖时,没有理由一个块的失败应该停止其余的权利吗?

示例:

const div1 = document.querySelector('#alphaDiv');
div1.style.color = 'red';

const div2 = document.querySelector('#bravoDiv');
div2.style.display = 'flex';

如果由于某种原因导致div1代码出错,则执行将停在那里,div2的代码将永远无法运行。
为解决此问题,我始终使用setTimeouttry catch来细分非相互依赖的代码/函数调用。

这一般是怎么做的?或者是否存在针对此类意外情况的标准最佳做法? 另外,我所指的是一个通用术语吗?

修改
this之类的事情发生时,我特别要求客户方 对于发现和处理每个浏览器的每个小怪癖来说,这似乎是一场失败的战斗。

2 个答案:

答案 0 :(得分:1)

将代码置于try / catch中是合理的做法,以确保错误(即异常)不会导致程序失败并提前终止。例如:

try {
     const div1 = document.querySelector('#alphaDiv');
     div1.style.color = 'red';
} catch (e) {
     console.error('div1 is null');
}

try {
     const div2 = document.querySelector('#bravoDiv');
     div2.style.display = 'flex';
} catch (e) {
     console.error('div2 is null');
}

您还可以检查应用程序的状态,以验证您的下一个语句是否会导致问题。例如,在您的示例代码中,您可以修改它以执行以下操作:

const div1 = document.querySelector('#alphaDiv');
if (div1) {
    div1.style.color = 'red';
}

const div2 = document.querySelector('#bravoDiv');
if (div2) {
    div2.style.display = 'flex';
}

注意:如果选择器是垃圾,看起来像document.querySelector可以抛出异常,例如:

document.querySelector("@#$%")

答案 1 :(得分:1)

您需要平衡某些事情失败的可能性。

例如,如果您try...catch没有投掷,则不需要document.querySelector

但是,如果浏览器无法将document.querySelector识别为有效选择器,则会引发#alphaDiv。但是,遇到不支持ID选择器的浏览器的概率可能微不足道。作为替代方案,您可以考虑document.getElementById。它会更快,而且永远不应该扔掉。

排除querySelector错误,您可以检查您尝试检索属性或尝试调用的每个值是否确实存在。像

这样的东西
if (document.querySelector) {
  // Let's assume the browser can parse CSS ID selectors
  const div1 = document.querySelector('#alphaDiv');
  if (div1 && div1.style) {
    div1.style.color = 'red';
  }
  const div2 = document.querySelector('#bravoDiv');
  if (div2 && div2.style) {
    div2.style.display = 'flex';
  }
}

那里也有一些假设,例如:如果document.querySelector是真实的,那么它具有适当的值。

但即使在这样的防御性编码中,仍然存在问题。如果我没记错的话,在style中分配不支持的CSS值时,旧版本的IE会出错。

因此,您必须决定,如果您希望您的代码完全安全,那么使用try...catch可能会更好。但它很丑陋并且可能会使某些引擎上的代码变慢。而且通常它不值得。

您还提到setTimeout。这可行,但记得它是异步的。根据您的想法,这可能是个问题。