2012-06-16 4 views
1

try-catch 블록에서 튀어 나오는 키워드가있는 언어가 있습니까?"try-catch"에서 건너 뛰시겠습니까?

lambda { 
    begin 
     p 0 
     break 
     p 1 
    rescue 
     p 2 
    end 
}.call 
p 3 

또한 (내가 믿는)의 가능한 자바 스크립트에서 :

예를 들어, 루비에서 둘러보기가있다.
그러나 (들여 쓰기를 피하기 위해) 익명 함수가없는 방법을 원합니다. break 또는 continue과 같은 경우가 있습니다.

저는 C/C++/C# 언어가 using goto 인 것을 알고 있습니다.

다른 접근 방식으로 언어가 존재합니까?

+0

나는 당신이해야한다고 생각하지 않습니다. 이것은 나쁜 생각입니다. 투표를 종료합니다. – duffymo

+0

return 문을 사용하십시오. ;-) –

+0

여기의 유스 케이스는 무엇입니까? 그냥 예외를 던지지 말고'try..catch' 블록은 아무것도하지 않을 것입니다. 'if..else'와 같은 다른 구조를 사용하거나 함수가 정상적인 실행 제어를 위해 리턴합니다. – deceze

답변

1

당신은 잡을 수 있지만 아무것도하지 않는 알려진 예외를 던질 수 있습니다. 에서 C#

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

많은 언어로 된 예외는 클래스입니다. 그리고 그것을 올리면 객체 생성, 느린 생성자 호출 등입니다. 실제로 필요하지 않은 로그에 스팸이 될 수도 있습니다. – Nakilon

+0

@Nakilon : 로그하지 않으면 로그를 채울 수 없습니다. 속도는 실제로 측정 했습니까? 예외는 많은 사람들이 생각하는 것처럼 느리지는 않습니다. 그러나 다른 이유 때문에 이런 종류의 예외를 사용하는 것은 잘못입니다. 프로그램 흐름을 이해하기가 훨씬 어려워집니다. – configurator

1

코드를 사용하면 코드의 어느 부분에서 벗어날 수 있습니다. 예를 들어 Scheme에 call-with-current-continuation을 입력합니다. (그들은 try/catch 블록에 국한되지 것) 일반적으로

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

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

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

, 계속이 에서 프로 시저의 실행에 어떤 점을 탈출하는 데 사용할 수 있습니다 wikipedia에서이 예는 기본 개념을 설명 아무리 깊게 중첩되어 있더라도, 이것에 관해서는 Exception 또는 goto보다 일반적인 구조입니다. 두 구조가 연속으로 구현 될 수 있기 때문입니다.

처음에는 연속을 쉽게 이해할 수있는 개념이 아니지만 실습을 통해 매우 유용 할 수 있습니다. paper에서 여러 가지 지속 가능성 응용 프로그램에 대해 자세히 설명합니다.

0

기본적으로 코드의 특정 부분 실행을 건너 뛰려면 goto을 입력하는 것처럼 들립니다. 같은 뭔가 :

foo(); 
if (!bar) { 
    goto end; 
} 
baz(); 

end: 
print "ended"; 

나는 프로와 goto의의 단점으로 가지 않을 것이다, 그러나 그들은 여러 가지 이유로 가지 언어로 사용할 수 없습니다입니다. 당신은 거의 항상 비록 같은 효과를 아래와 같이 코드를 공식화 할 수

try { 
    foo(); 
    if (bar) { 
     baz(); 
    } 
} catch (Exception e) { 
    help(); 
} 

print "ended"; 

그것은 실행을 건너 뛰는 같은 효과가 있습니다 :

foo(); 
if (bar) { 
    baz(); 
} 

print "ended"; 

이것은 분명히 또한 당신이 실제로 사용 예외가있을 때 작동합니다 특정 상황에서 코드의 특정 분기에 대한 정보를 제공하며이를 수행하는 표준 방법입니다. try..catch을 깨거나 동등한 goto을 사용하면 어떤 이점도 얻을 수 있다고 상상할 수는 없습니다.

+0

'continue' 그리고 * cycle block *을위한'break '도'if'를 통해 구현 될 수 있습니다. 그러나 그들은 둘 다''if''와''들여 쓰기 '를 피할 수있게하기 위해 존재합니다. 내 소원은 try catch block *과 같은 목적이다. – Nakilon

+0

'continue'와'break'는 특별히 * 반복 * 제어 구조에서 * 반복을 처리하기위한 것입니다. 레이블과'goto'를 사용하여 전체 루프를 구현 한 다음'continue'와'break'에'if'를 사용할 수 있습니다 ...하지만'try..catch'는 처음부터 선형이어서 반복하지 않습니다. 그러므로 나는 그 비교를 실제로 보지 못한다. 핵심에서는 특정 조건에서 특정 코드 블록의 실행을 건너 뛰기 만하면됩니다. 그건'만약'이 ... – deceze

+0

BTW. 사실'try..catch'는 반복 할 수 있습니다. 예를 들어, Ruby는 매우 유용한'retry' 키워드를 가지고 있습니다. 그리고 나는 많은 파이썬 코드를'while True : try ... if (f) : break ... except : pass'라고 본다. – Nakilon

관련 문제