首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跳出"try-catch"?

跳出"try-catch"?
EN

Stack Overflow用户
提问于 2012-06-16 23:52:42
回答 3查看 1.5K关注 0票数 2

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

例如,在Ruby中有一个漫游:

代码语言:javascript
复制
lambda {
    begin
        p 0
        break
        p 1
    rescue
        p 2
    end
}.call
p 3

(我相信)在Javascript中也是可能的。

但是我想要一种没有匿名函数(避免缩进)的方法--就像breakcontinue是可能的那样。

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

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

EN

回答 3

Stack Overflow用户

发布于 2012-06-17 00:01:48

你总是可以抛出一个已知的异常,但你可以捕获它而不做任何事情。在c#中

代码语言:javascript
复制
try {
    if(true)
        throw new GetOutException();
}
catch(GetOutException e) {
}
catch(Exception e) {
    // Do something here    
}
票数 1
EN

Stack Overflow用户

发布于 2012-06-17 00:04:29

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

代码语言:javascript
复制
(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

票数 1
EN

Stack Overflow用户

发布于 2012-06-18 17:27:00

因此,基本上听起来就像是在请求一个等价的goto来跳过代码的特定部分的执行。类似于:

代码语言:javascript
复制
foo();
if (!bar) {
    goto end;
}
baz();

end:
print "ended";

我不会深入讨论goto的优缺点,但由于各种原因,它们在许多语言中都不可用。你几乎可以像下面这样制定你的代码,以达到同样的效果:

代码语言:javascript
复制
foo();
if (bar) {
    baz();
}

print "ended";

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

代码语言:javascript
复制
try {
    foo();
    if (bar) {
        baz();
    }
} catch (Exception e) {
    help();
}

print "ended";

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11064942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档