V8 эквивалентность улова SpiderMonkey (е, если е ..) - PullRequest
3 голосов
/ 08 января 2011

Используя SpiderMonkey, вы можете использовать условные блоки перехвата для направления исключений в соответствующий обработчик.

try {
// function could throw three exceptions
getCustInfo("Lee", 1234, "lee@netscape.com")
}
catch (e if e == "InvalidNameException") {
// call handler for invalid names
bad_name_handler(e)
}
catch (e if e == "InvalidIdException") {
// call handler for invalid ids
bad_id_handler(e)
}
catch (e if e == "InvalidEmailException") {
// call handler for invalid email addresses
bad_email_handler(e)
}
catch (e){
// don't know what to do, but log it
logError(e)
}

пример из MDN

Однако в V8 этот код не будет компилировать любые предложения или обходные пути, кроме очевидных.

1 Ответ

6 голосов
/ 08 января 2011

Насколько мне известно, в других движках JavaScript подобной функции нет.

Но с помощью этой функции легко преобразовать код:

try {
    A
} catch (e if B) {
    C
}

в код, который использует только стандартныефункции, которые поддерживаются всеми механизмами JavaScript:

try {
    A
} catch (e) {
    if (B) {
        C
    } else {
        throw e;
    }
}

Пример, который вы привели, еще проще перевести:

try {
    getCustInfo("Lee", 1234, "lee@netscape.com");
} catch (e) {
    if (e == "InvalidNameException") {
        bad_name_handler(e);
    } else if (e == "InvalidIdException") {
        bad_id_handler(e);
    } else if (e == "InvalidEmailException") {
        bad_email_handler(e);
    } else {
        logError(e);
    }
}
...