gpt4 book ai didi

javascript - javascript 中的异常,我应该使用它们吗?如何使用?

转载 作者:搜寻专家 更新时间:2023-11-01 04:20:17 24 4
gpt4 key购买 nike

有人多次告诉我在 javascript 中使用异常是“不好的”。还没有真正被告知为什么它不好,但我应该改为使用 break、continue 和 return。

这很好,除了我不需要返回/中断/继续,我需要抛出。我有一个情况,我有一个迭代器函数相互嵌套,每个迭代器函数在调用时返回下一个值,所以我使用一个异常来指示没有更多要迭代的东西:似乎是一种合乎逻辑的方法,使代码干净并在实践中完美运行。真的有什么理由不在 js 中使用异常吗?

第二个问题,当我使用异常时,我应该抛出什么样的对象?对于错误,我显然会抛出 Error 的实例,但对于特殊情况(停止迭代等),我需要一种快速的方法来检查那些特定的异常,而我所做的只是定义一个空的命名函数(function StopIteration(){ }) 并且由于函数是通过引用进行比较的,所以我总是可以检查它是否是我的特例,或者我应该重新抛出。在 js 中有更好或更惯用的方法来做到这一点吗?我真的应该尝试重构我的代码以避免使用异常吗?

谢谢

最佳答案

听起来您正在使用嵌套循环在多维空间中进行搜索,这在编程中是很常见的事情。当找到目标然后被最外层循环周围的“catch” block 捕获时,很容易从最内层循环抛出异常,但这通常被认为是糟糕的做法。

语言设计者意识到了这个陷阱,因此他们允许我们为循环结构赋予标签(名称),以便我们可以摆脱它们(或继续使用它们)。考虑这个例子:

function findValueInMatrix(value, matrix) {
var r, c, coords, rows=matrix.length, cols=matrix[0].length;
found: // Label the outer loop as "found" so we can break from it.
for (r=0; r<rows; r++) {
for (c=0; c<cols; c++) {
if (matrix[r][c] == value) {
coords = [r, c]
break found; // Exit the loop labeled "found".
}
}
}
return coords;
}

您可以在 this post about breaking from nested loops 中找到更多信息.

jsPerf test case还表明打破标签名义上比抛出异常更快(大概在大多数浏览器中)。

关于javascript - javascript 中的异常,我应该使用它们吗?如何使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140511/

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