2012-06-16 123 views
1

有没有关键字跳出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

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

+0

我不认为你应该想。这是一个坏主意。投票结束。 – duffymo

+0

尝试返回语句。 ;-) –

+0

这里的用例是什么?只是不要抛出异常,'try..catch'块不会做任何事情。使用其他结构如'if..else'或函数返回正常执行控制。 – deceze

回答

1

你总是可以抛出一个已知的异常,你可以捕获但什么也不做。在c#中

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

许多语言的例外是一类。当你提出它时,它会创建一个对象,调用一个* slow *构造函数等等。另外,它可能是垃圾邮件,它并不是你真正需要的日志。 – Nakilon

+0

@Nakilon:如果你没有登录它,它将不会填满你的日志。至于速度,你真的测过它了吗?例外情况并没有许多人想象的那么慢。这种情况出于其他原因使用异常是错误的 - 它使得程序流程难以理解。 – configurator

1

使用continuations,您可以跳出代码中的任何部分。例如,Scheme中的call-with-current-continuation。从wikipedia本实施例说明的基本概念:(他们限于try/catch块)

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

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

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

通常,延续可用于从逃脱在过程的执行的任何点,不管它的嵌套程度如何 - 在这方面,这是一个比Exceptiongoto更为一般的构造,因为这两个构造都可以用连续性来实现。

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

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将提供任何优势。

+0

'continue'和'break'用于*循环块*也可以通过'if'实现。但它们都存在,以避免“如果”及其缩进。我的愿望是在相同的目的* try catch block *。 – Nakilon

+0

'continue'和'break'专门用于处理*循环*控制结构中的*迭代。你*可以*使用标签和'goto'来实现整个循环,然后对'continue'和'break'使用'if' ...但是'try..catch'是线性的,它不会循环。因此我没有真正看到比较。在核心上,您只是想在特定条件下跳过某些代码块的执行。这就是'if'的用途... – deceze

+0

BTW。其实'try..catch'可以循环。例如,Ruby有非常有用的'retry'关键字。我看到很多Python代码都是用'while True:try ... if(f):break ... except:pass' – Nakilon