оператор return в блоке finally

В MDN заявил,

Если блок finally возвращает значение, это значение становится возвращаемым значением всей продукции try-catch-finally, независимо от любых операторов return в блоках try и catch:

Итак, я пытаюсь выполнить следующий код,

function an(){
    var r = try{
        throw 1;
    } catch(e){
        console.log("Caught: %o", e);
    } finally {
        return 2;
    }
    console.log("r=%o", r);
    return 3;
}

Это не работает. Выдает синтаксическую ошибку.

SyntaxError: syntax error

    var r = try{

Что здесь не так?


person Genghis Khan    schedule 08.06.2013    source источник
comment
ты не можешь иметь вещь r=..   -  person Ishank    schedule 08.06.2013


Ответы (3)


Я думаю, проблема просто в том, что вы пытаетесь присвоить оператор try переменной. Насколько мне известно (и я не эксперт JS), вы не можете этого сделать. Это утверждение, а не выражение.

Я считаю, что это совершенно отдельно от того, что происходит с возвращаемыми значениями.

Попробуйте поместить оператор try/catch/finally в отдельную функцию и вместо этого вызвать ее, присвоив результат r:

function foo() {
    try {
        throw 1;
    } catch(e) {
        console.log("Caught: %o", e);
    } finally {
        return 2;
    }
}

var r = foo();
console.log("r=%o", r);

В консоли Javascript Chrome это дает:

Caught: 1
r=2

РЕДАКТИРОВАТЬ: я согласен с тем, что термин «производство» в документах здесь немного сбивает с толку. Судя по комментариям, это технически правильно, но это, конечно, не мешает сбивать с толку. Я подозреваю, что в большинстве случаев «функция» была бы более ясной, возможно, менее точной.

person Jon Skeet    schedule 08.06.2013
comment
Я также предполагаю, что это оператор try-catch, поэтому возвращаемого значения нет. Но заявление от MDN довольно запутанно. - person Genghis Khan; 08.06.2013
comment
@GenghisKhan: Да, это скорее утверждение, чем выражение. Я подозреваю, что в большинстве случаев было бы лучше просто сказать здесь функцию вместо производства, но вполне могут быть крайние случаи, когда это тоже неверно. - person Jon Skeet; 08.06.2013
comment
@JonSkeet: нет, производство правильное. Дело в том, что продукция JS, включая операторы, имеет значения, просто вы не можете присвоить их переменным. - person georg; 08.06.2013
comment
@thg435 thg435, значит, var x=1; — это постановка, которая возвращает undefined? - person Genghis Khan; 08.06.2013
comment
@GenghisKhan: возвращает завершение, равное (normal, empty, empty) (es5.github.io/#x12.2). - person georg; 08.06.2013

Ваше предположение неверно. У вас синтаксическая ошибка. Блок try ничего не возвращает.

function an(){
var r;// <---- here
try{// <----- here
    throw 1;
} catch(e){
    console.log("Caught: %o", e);
} finally {
    return 2;
}
console.log("r=%o", r);
return 3;
}
person Community    schedule 08.06.2013

Они имеют в виду следующее:

function an() {
    try {
        throw 999;
        return "in try";
    } catch(e) {
        return "in catch";
    } finally {
        return "in finally";
    }
    return "in func";
}

console.log(an()) // in finally

JS игнорирует все операторы return, кроме одного в блоке finally.

person georg    schedule 08.06.2013