finally块中的返回语句

3
MDN 中它说:

如果 finally 块返回一个值,该值将成为整个 try-catch-finally 结构的返回值,而不管 try 和 catch 块中是否有 return 语句:

所以我尝试执行以下代码:
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{

这里有什么问题?

你不能有 r= 这个东西。 - Ishank
3个回答

6
我认为问题很简单,您试图将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);

在Chrome的Javascript控制台中,这将会显示:
Caught: 1
r=2

编辑:我同意文档中的“production”一词在此处有点令人困惑。根据评论,从技术上讲它是准确的 - 但这当然不会阻止它变得令人困惑。我猜想,在大多数情况下,“function”可能会更清晰,也可能不那么明确。


我猜想它是一个try-catch语句,因此没有返回值。但是MDN的陈述相当令人困惑。 - Genghis Khan
@GenghisKhan:是的,这是一个语句而不是表达式。我怀疑在大多数情况下,用“函数”而不是“生成”可能更好,但也可能有一些特殊情况不正确。 - Jon Skeet
1
@JonSkeet:不,"production"是正确的。问题在于,JS production,包括语句,在运行时都有值,只是你无法将它们分配给变量。 - georg
@thg435 所以 var x=1; 是一个返回 undefined 的表达式吗? - Genghis Khan
@GenghisKhan:它返回与(normal, empty, empty)相等的“完成值”(http://es5.github.io/#x12.2)。 - georg

3
他们的意思是这样的:
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

除了 finally 块中的 return 语句外,JS 忽略所有的 return 语句。


我认为这是最简洁准确的答案。 - pbotas

1
你的假设是错误的。你有语法错误。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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接