在 try catch 语句中将 err 传递给 finally
Passing an err to finally in a try catch statement
我正在尝试编写一个异步数组严格相等函数来报告我想要的错误。
这是我的函数:
ArrayStrictEqual = function (arr1, arr2, callback) {
var arr2s = arr2.sort();
var eq = true;
try {
arr1.sort().forEach(function (item, index, array) {
if(!(_.isEqual(arr2s[index], item))) {
throw new Error(arr1 + " is not strictly equal to " + arr2);
}
});
}
catch (err) {
if (err) eq = false;
}
finally {
callback(err, eq);
}
};
但是,当我 运行 这个时,它说 Uncaught ReferenceError: err is not defined
。
我打算在 try-catch 之前将 err 初始化为 null。但这似乎不是正确的做法。但是,我不确定正确的做法是什么。我是否应该以完全不同的方式解决这个问题(即不是 try-catch)?
err
仅在 catch
语句的范围内(有关技术细节,请参阅 Why do catch clauses have their own lexical environment?)。
你可以简单地做
try {
…
callback(null, true);
} catch (err) {
callback(err, false);
}
虽然这可能不是您想要的,因为它会在第一个 callback()
抛出时再次调用 callback
。为了避免这种情况,我们需要像 Python 中那样的 try-catch-else
,在 JS 中你需要一个额外的布尔标志。
然而,抛出一个错误来中断 forEach
迭代只是一种可怕的做法。不要这样做。使用 .every()
代替,它完全符合您的要求。另外,您可以考虑避免比较数组的变异,在排序之前复制它们。
我正在尝试编写一个异步数组严格相等函数来报告我想要的错误。
这是我的函数:
ArrayStrictEqual = function (arr1, arr2, callback) {
var arr2s = arr2.sort();
var eq = true;
try {
arr1.sort().forEach(function (item, index, array) {
if(!(_.isEqual(arr2s[index], item))) {
throw new Error(arr1 + " is not strictly equal to " + arr2);
}
});
}
catch (err) {
if (err) eq = false;
}
finally {
callback(err, eq);
}
};
但是,当我 运行 这个时,它说 Uncaught ReferenceError: err is not defined
。
我打算在 try-catch 之前将 err 初始化为 null。但这似乎不是正确的做法。但是,我不确定正确的做法是什么。我是否应该以完全不同的方式解决这个问题(即不是 try-catch)?
err
仅在 catch
语句的范围内(有关技术细节,请参阅 Why do catch clauses have their own lexical environment?)。
你可以简单地做
try {
…
callback(null, true);
} catch (err) {
callback(err, false);
}
虽然这可能不是您想要的,因为它会在第一个 callback()
抛出时再次调用 callback
。为了避免这种情况,我们需要像 Python 中那样的 try-catch-else
,在 JS 中你需要一个额外的布尔标志。
然而,抛出一个错误来中断 forEach
迭代只是一种可怕的做法。不要这样做。使用 .every()
代替,它完全符合您的要求。另外,您可以考虑避免比较数组的变异,在排序之前复制它们。