Javascript 为什么此代码中没有抛出错误?
这是我的代码(Javascript): 函数getNumbers(){ var numberString=document.getElementById(“数字”).value; 变量实际数=[]; var流量指数=0; for(设i=0;iJavascript 为什么此代码中没有抛出错误?,javascript,error-handling,Javascript,Error Handling,这是我的代码(Javascript): 函数getNumbers(){ var numberString=document.getElementById(“数字”).value; 变量实际数=[]; var流量指数=0; for(设i=0;i
getNumbers()
,它返回一个数组,其中array[0]=1
和array[1]=0
。现在,我想在数组[1]==0
时抛出一个异常“bad”。但是,try
异常和catch
异常都没有被抛出,但是finally子句起作用了。有什么问题
注意:在被零除的情况下,不会抛出异常,相反,答案是
无穷大
。getNumbers()工作正常。异常被抛出,但您通过执行以下操作来抑制异常:
finally {
return answer;
}
finally
子句拥有最终发言权。如果从中返回,则会抑制异常并使功能正常完成
解决这个问题的一种方法是删除finally
子句,并放置返回答案代码>在中尝试
只是FWIW,其他一些注释作为注释:
function getNumbers(){
var numberString = document.getElementById("numbers").value;
var actualNumbers = [];
var flowIndex = 0;
// You might consider splitting the string into an array of one-character strings so you
// aren't constantly calling a method (`charAt`), like this:
// `var chars = numberString.split("");`
// Then index into `chars`
// N.B. `let` is an ES2015 (ES6) feature not all JavaScript engines have as it's new;
// the rest of your code is using the older `var`
// --v
for (let i = 0; i < numberString.length; i++){
// No need to escape the comma --------------------------------v
if(numberString.charAt(i) != " " && numberString.charAt(i) != "\," && numberString.charAt(i) != "\t"){
actualNumbers[flowIndex] = parseInt(numberString.charAt(i));
flowIndex++;
}
// No need for the `else continue;` at all
else continue;
// In the above, you regularly call `charAt` four times when once would have been sufficient.
// You might also consider a `switch`
}
return actualNumbers;
}
function division(){
try{
// Rather than calling `getNumbers` three separate times, call it once and remember its return value
// doing the calculation should be AFTER checking [1] for 0, not before
var answer = getNumbers()[0] / getNumbers()[1];
if(getNumbers()[1] == 0)
throw "bad"; // Recommend using Error, e.g.: `throw new Error("bad")`
// Move the `return answer;` here
}
catch(error){
// You've thrown a string, it doesn't have a `description` property
// Separately: Why throw something above, just to catch it here and throw something else?
throw error.description + "Division by zero error";
}
// Remove the finally
finally{
return answer;
}
}
或者使用更简洁的替代getNumbers
,但在输入中进行更多循环(这通常无关紧要):
异常正在被抛出,但是您通过以下操作来抑制异常:
finally {
return answer;
}
finally
子句拥有最终发言权。如果从中返回,则会抑制异常并使功能正常完成
解决这个问题的一种方法是删除finally
子句,并放置返回答案代码>在中尝试
只是FWIW,其他一些注释作为注释:
function getNumbers(){
var numberString = document.getElementById("numbers").value;
var actualNumbers = [];
var flowIndex = 0;
// You might consider splitting the string into an array of one-character strings so you
// aren't constantly calling a method (`charAt`), like this:
// `var chars = numberString.split("");`
// Then index into `chars`
// N.B. `let` is an ES2015 (ES6) feature not all JavaScript engines have as it's new;
// the rest of your code is using the older `var`
// --v
for (let i = 0; i < numberString.length; i++){
// No need to escape the comma --------------------------------v
if(numberString.charAt(i) != " " && numberString.charAt(i) != "\," && numberString.charAt(i) != "\t"){
actualNumbers[flowIndex] = parseInt(numberString.charAt(i));
flowIndex++;
}
// No need for the `else continue;` at all
else continue;
// In the above, you regularly call `charAt` four times when once would have been sufficient.
// You might also consider a `switch`
}
return actualNumbers;
}
function division(){
try{
// Rather than calling `getNumbers` three separate times, call it once and remember its return value
// doing the calculation should be AFTER checking [1] for 0, not before
var answer = getNumbers()[0] / getNumbers()[1];
if(getNumbers()[1] == 0)
throw "bad"; // Recommend using Error, e.g.: `throw new Error("bad")`
// Move the `return answer;` here
}
catch(error){
// You've thrown a string, it doesn't have a `description` property
// Separately: Why throw something above, just to catch it here and throw something else?
throw error.description + "Division by zero error";
}
// Remove the finally
finally{
return answer;
}
}
或者使用更简洁的替代getNumbers
,但在输入中进行更多循环(这通常无关紧要):
能否添加getNumbers()
函数的主体?为什么要调用三次getNumbers()
?可能将reuslt分配给一个变量并使用该变量。此代码应该抛出“除零”,因为这发生在您的条件之前。我认为,逻辑上,if
语句应该在answer
definition@Burki:在JavaScript中,x/0
是Infinity
,不是错误。您可以添加getNumbers()
函数的主体吗?为什么要调用三次getNumbers()
?可能将reuslt分配给一个变量并使用该变量。此代码应该抛出“除零”,因为这发生在您的条件之前。我认为,逻辑上,if
语句应该在answer
definition@Burki:在JavaScript中,x/0
是Infinity
,不是错误。@T.J Crowder,thnx很多,但还有一件事。。。。try异常是否在控制台中可见?因为在我的浏览器控制台中,我看不到“坏的”exception@Siddhantinf:如果您抑制它,则不会。一般来说,已处理的异常(即以前的异常)不会报告给控制台。好的,thnx很多sir@Siddhantinf:很乐意帮忙。我在答案的末尾加了一点,就是FWIW@T.J Crowder,有很多,但还有一件事。。。。try异常是否在控制台中可见?因为在我的浏览器控制台中,我看不到“坏的”exception@Siddhantinf:如果您抑制它,则不会。一般来说,已处理的异常(即以前的异常)不会报告给控制台。好的,thnx很多sir@Siddhantinf:很乐意帮忙。我在答案的末尾加了一点,就是FWIW。
function getNumbers(str) {
return str.split("")
.filter(function(ch) { return /\d/.test(ch); })
.map(function(ch) { return +ch; });
}
function division() {
var numbers = getNumbers(document.getElementById("numbers").value);
if (numbers[1] == 0) {
throw new Error("Division by zero error");
}
return numbers[0] / numbers[1];
}