JavaScript 异常处理未按预期工作

JavaScript Exception handling not working as expected

本文关键字:工作 异常处理 JavaScript      更新时间:2023-09-26

这是我第一次使用 JavaScript 异常和异常处理。

好的,我有以下简单的代码。

function getMonth( month ) {
    month = month -1;
    var months = [
                    "January",
                    "February",
                    "March",
                    "April",
                    "May",
                    "June",
                    "July",
                    "August",
                    "September",
                    "October",
                    "November",
                    "December"
                ];
    if( month != null ) {
        if( months.indexOf( month ) ) {
            return months[month];
        } else {
            throw "Invalid number for month";
        }
    } else {
        throw "No month provided";
    }
}

基本上,它首先检查是否向函数提供了参数,如果没有,则抛出和异常。其次,它会检查提供的数字是否与有效的月份数字匹配,如果没有引发异常。

我按如下方式运行它:

try {
    month = getMonth();
} catch( e ) {
    console.log( e );
}

控制台不会记录异常"未提供月份"。这是为什么呢?我目前正在阅读有关例外的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Control_flow_and_error_handling#Exception_Handling_Statements

这是一个

棘手的问题。这里的问题是:您的代码实际上永远不会到达throw语句,而是运行并正常返回。原因有点"JavaScriptish":

在调用函数时,引入了变量month(因为它在参数中),但到目前为止,它的值是 undefined 。然后month -1;语句与返回Illegal NumberNaN的语句相同undefined - 1。(如果它真的扔了会更好,我同意)。

您的第一个if(month != null)现在解析为true month = NaNNaN != null。第二个条件返回 true,因为如果给定的值不在数组中Array.indexOf则实际上返回-1-1是一个有效值,因此解析为 true

我再次同意 - 这有点违反直觉。但是,嘿 - 欢迎来到JavaScript。它有好的一面,我保证;)

小提示:尝试我在浏览器控制台中发布的所有条件和语句,然后您将更好地理解它。

这是因为月份变量是undefined的,它不等于null

try {
    month = getMonth();
    alert(month);
} catch( e ) {
    alert(e);
}
function getMonth( month ) {
    month = month -1;
    var months = [
                    "January",
                    "February",
                    "March",
                    "April",
                    "May",
                    "June",
                    "July",
                    "August",
                    "September",
                    "October",
                    "November",
                    "December"
                ];
    if( month != null ) {
        if( months.indexOf( month ) ) {
            return months[month];
        } else {
            throw "Invalid number for month";
        }
    } else {
        throw "No month provided";
    }
}

有关更多信息,请阅读本文