是否有一种带有关键字的语言可以跳出try-catch
块?
例如,Ruby中有一个解决方法:
lambda {
begin
p 0
break
p 1
rescue
p 2
end
}.call
p 3
在Javascript中也可以(我相信)
但是我想要一种没有匿名功能的方法(以避免缩进) - 比如break
或continue
是否可行。
我知道,C / C ++ / C#语言允许using goto
。
是否存在采用其他方法的语言?
答案 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
块) ,无论它有多深层次嵌套 - 在这方面,它是一个比Exception
或goto
更通用的结构,因为这两个结构都可以用连续语来实现。
首先,延续不是一个易于理解的概念,但通过实践它们可能非常有用,请参阅此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
会带来任何好处。