我有以下代码,无需使用throw就可以工作,但是当我使用throw关键字时,它不会返回适当的消息。我究竟做错了什么?

更新资料

我要故意捕获错误消息,所以我故意调用函数addme而不是addMe

代码-无需使用throw即可工作

function addMe() {
        var a = 1;
        var b = 2;
        return a+b;
    }

    try {
        addme();
    }


    catch (err) {
        document.write(err.name + " " + err.message);
    }


代码-不起作用

function addMe() {
        var a = 1;
        var b = 2;
        return a+b;
    }

    try {
        addme();
        throw "error 1";
    }

    catch(err) {
        if(err ==  "error 1") {
            document.write("This is a custom message for error 1");
        }
    }

最佳答案

addme是未定义的,因此您永远不会到达throw语句。 (特别是,当您调用ReferenceError而不是addme时,首先抛出addMe

要记住的关键是要从上至下读取程序,直到注入GOTO(错误,调用函数,从函数返回等)为止,该命令会将您发送到其他地方。一旦GOTO Raptor,该行下方的行就不能保证被调用。

try {
    addme(); // Reference Error Thrown - go to catch statement
    throw "error 1"; // We never get here
}

catch(err) {
    // Never true - err is always a ReferenceError.
    if(err ==  "error 1") {
        document.write("This is a custom message for error 1");
    }


要处理任何类型的错误,您可以检查err instanceof TYPE_OF_ERROR

catch(err) {
    if(err instanceof ReferenceError) {
        document.write("This is a custom message for ReferenceErrors");
    }
}


(并且请记住,a string is not an error

10-06 07:51