Javascript 为什么此代码中没有抛出错误?

Javascript 为什么此代码中没有抛出错误?,javascript,error-handling,Javascript,Error Handling,这是我的代码(Javascript): 函数getNumbers(){ var numberString=document.getElementById(“数字”).value; 变量实际数=[]; var流量指数=0; for(设i=0;i

这是我的代码(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];
}