【问题标题】:return statement in finally blockfinally 块中的 return 语句
【发布时间】:2013-06-04 14:39:54
【问题描述】:

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=的东西..

标签: javascript exception try-catch try-catch-finally


【解决方案1】:

我认为问题仅仅是您试图将 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

编辑:我同意文档中的“生产”一词在这里有点混乱。根据 cmets 的说法,它在技术上是准确的 - 当然,这并不能阻止它令人困惑。我怀疑在大多数情况下,“功能”会更清晰,可能不太准确。

【讨论】:

  • 我也猜测它的 try-catch 是一个语句,因此没有返回值。但是 MDN 的说法相当混乱。
  • @GenghisKhan:是的,这是一个陈述而不是一个表达。我怀疑在大多数情况下,在这里只说“功能”而不是“生产”会更好,但也可能存在不正确的极端情况。
  • @JonSkeet:不,“生产”是正确的。问题是,JS 产生式,包括语句,确实有值,你不能将它们分配给变量。
  • @thg435 所以var x=1; 是一个返回undefined的产品?
  • @GenghisKhan:它返回一个等于(normal, empty, empty)es5.github.io/#x12.2)的“完成”。
【解决方案2】:

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

【讨论】:

    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2014-05-11
      • 2020-06-17
      • 1970-01-01
      • 2011-08-07
      • 2018-03-21
      相关资源
      最近更新 更多