2012-06-16 167 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