跳出“试一试”?

时间:2012-06-16 15:52:42

标签: language-agnostic try-catch

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

例如,Ruby中有一个解决方法:

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

在Javascript中也可以(我相信) 但是我想要一种没有匿名功能的方法(以避免缩进) - 比如breakcontinue是否可行。

我知道,C / C ++ / C#语言允许using goto

是否存在采用其他方法的语言?

3 个答案:

答案 0 :(得分:1)

你总是可以抛出一个你知道的已知异常但却什么都不做。在c#

try {
    if(true)
        throw new GetOutException();
}
catch(GetOutException e) {
}
catch(Exception e) {
    // Do something here    
}

答案 1 :(得分:1)

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

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

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

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

通常,可以使用延续来从程序执行中的任何点逃脱(它们仅限于try/catch块) ,无论它有多深层次嵌套 - 在这方面,它是一个比Exceptiongoto更通用的结构,因为这两个结构都可以用连续语来实现。

首先,延续不是一个易于理解的概念,但通过实践它们可能非常有用,请参阅此paper详细说明延续的许多可能应用。

答案 2 :(得分:0)

所以基本上听起来你要求goto等价物来跳过代码特定部分的执行。类似的东西:

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

end:
print "ended";

我不会考虑goto的优点和缺点,但由于各种原因,它们无法用多种语言提供。您几乎可以像下面一样制定代码,但效果相同:

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

print "ended";

当你实际使用例外时,这显然也有效:

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

print "ended";

它具有在某些情况下跳过特定代码分支执行的相同效果,并且是执行此操作的标准方法。我无法想象这样一种情况:突破try..catch或使用等效的goto会带来任何好处。