JavaScript 异常处理未按预期工作

标签 javascript exception

这是我第一次处理 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;undefined - 1 相同,返回一个 Illegal NumberNaN。 (如果它真的抛出的话会更好,我同意)。

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

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

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

关于JavaScript 异常处理未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28920214/

相关文章:

java - 抛出 java 异常并停止

java - 抛出的优先级以及同一异常的抛出

c# - 是否有预定义的 ThisIsABugException?

javascript - 在嵌套数组中创建带有 javascript 错误的游戏

javascript - 我从下一行的函数返回后,JS promisified 函数会单独运行吗

javascript - 创建子类,其属性是该父类对应属性的子类

java - 如何修复我的 NoSuchElementException?

scala - Akka future 异常(exception)

JavaScript:如何清除我的自定义键盘映射并使用默认键盘映射

javascript - 使用 kotlinx.html DSL 创建 CSS 类