有没有一种可以跳出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。
是否存在另一种方法的语言?
发布于 2012-06-17 00:01:48
你总是可以抛出一个已知的异常,但你可以捕获它而不做任何事情。在c#中
try {
if(true)
throw new GetOutException();
}
catch(GetOutException e) {
}
catch(Exception e) {
// Do something here
}发布于 2012-06-17 00:04:29
使用continuations,您可以跳过代码中的任何部分。例如,在方案中使用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。
发布于 2012-06-18 17:27:00
因此,基本上听起来就像是在请求一个等价的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会提供任何优势的情况。
https://stackoverflow.com/questions/11064942
复制相似问题