2

有没有一种带有关键字的语言可以跳出try-catch块?

例如,在 Ruby 中有一个 walkaround:

lambda {
    begin
        p 0
        break
        p 1
    rescue
        p 2
    end
}.call
p 3

(我相信)在 Javascript 中也是可能的。
但我想要一种没有匿名函数的方法(以避免缩进)——比如 if breakor continuewere possible。

我知道,C/C++/C# 语言允许使用goto.

是否存在采用另一种方法的语言?

4

3 回答 3

1

使用continuations,您可以跳出代码中的任何部分。例如,call-with-current-continuation在方案中。这个来自维基百科的例子说明了基本概念:

(define (f return)
  (return 2)
  3)

(display (f (lambda (x) x))) ; displays 3

(display (call-with-current-continuation f)) ; displays 2

通常,无论嵌套有多深,延续都可用于从过程执行中的任何点逃脱(它们不限于块)-在这方面,它是比 an或 a更通用的构造,因为这两个结构都可以在延续方面实现。try/catchExceptiongoto

起初,延续不是一个易于掌握的概念,但通过实践,它们可能非常有用,请参阅这篇论文,详细介绍延续的许多可能应用。

于 2012-06-16T16:04:29.293 回答
1

You could always just throw a known exception which you catch but do nothing with. In c#

try {
    if(true)
        throw new GetOutException();
}
catch(GetOutException e) {
}
catch(Exception e) {
    // Do something here    
}
于 2012-06-16T16:01:48.353 回答
0

所以基本上听起来你在要求一个goto等价物来跳过你的代码的特定部分的执行。就像是:

foo();
if (!bar) {
    goto end;
}
baz();

end:
print "ended";

我不会讨论 s 的优缺点goto,但由于各种原因,它们无法以多种语言提供。不过,您几乎总是可以像下面这样制定代码以获得相同的效果:

foo();
if (bar) {
    baz();
}

print "ended";

当您实际使用异常时,这显然也有效:

try {
    foo();
    if (bar) {
        baz();
    }
} catch (Exception e) {
    help();
}

print "ended";

它与在某些情况下跳过特定代码分支的执行具有相同的效果,并且是执行此操作的标准方法。我真的无法想象突破try..catch或使用等价物goto会提供任何优势的情况。

于 2012-06-18T09:26:59.760 回答