道歉,但我不确定我所问的是什么术语。
我所指的是当一些代码失败并阻止任何进一步的代码执行时 当代码的chucks彼此不依赖时,没有理由一个块的失败应该停止其余的权利吗?
示例:
const div1 = document.querySelector('#alphaDiv');
div1.style.color = 'red';
const div2 = document.querySelector('#bravoDiv');
div2.style.display = 'flex';
如果由于某种原因导致div1
代码出错,则执行将停在那里,div2
的代码将永远无法运行。
为解决此问题,我始终使用setTimeout
或try catch
来细分非相互依赖的代码/函数调用。
这一般是怎么做的?或者是否存在针对此类意外情况的标准最佳做法? 另外,我所指的是一个通用术语吗?
修改
当this之类的事情发生时,我特别要求客户方
对于发现和处理每个浏览器的每个小怪癖来说,这似乎是一场失败的战斗。
答案 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
。这可行,但记得它是异步的。根据您的想法,这可能是个问题。