2010-01-22 2 views
4

가능한 중복 :
Should java try blocks be scoped as tightly as possible?try 블록 범위 제한. 그게 그렇게 중요한 건가?

은 독자에게 더 많은 정보 것을 제외하고 try 블록 [작은 크기를 유지의 모든 성능 이점은 (특히 C에서 ++ 또는 Java)이 있습니까 어떤 진술이 던질 수 있는지].

다음 메소드를 사용하면 메소드를 버리고 싶지 않습니다.

void function() throws Exception 
{ 
    statement1 
    statement2 
    statement3 // can throw 
    statement4 
    statement5 
} 

은 더 나은이하는 것입니다 :

옵션 1

void function() 
{ 
    try { 
     statement1 
     statement2 
     statement3 // can throw 
     statement4 
     statement5 
    } 
    catch (...) { 
    } 
} 

또는

옵션 2

void function() 
{ 
    statement1 
    statement2 

    boolean success = false; 
    try { 
     statement3 // can throw 
     success = true; 
    } 
    catch (...) { 
    } 

    if (success) 
    { 
     statement4 
     statement5 
    } 
} 
+0

대부분의 구현에서 try/catch 블록은 예외가 발생할 때까지 거의 아무것도 들지 않습니다. 물론 예외가 발생하면 더 이상 성능은 신경 쓰지 말고 문제를 해결해야합니다. – GManNickG

+1

또한 지구상에서 왜 이런 예외를 금지하고 있습니까? 즉, 옵션 1은 더 깨끗합니다. 당신과 같은 코멘트는 추한 것없이 2 번과 같은 이점을줍니다 (어떤 기능이 던질 수 있는지 아는 것). – GManNickG

+1

@GMan 왜 내가 예외 사항을 금지합니까? 그것은 성능에 대한 나의 질문을 설명하기 위해 머리 꼭대기에있는 간단한 예 였기 때문에. 다음에 코드 스 니펫이 컴파일되지 않는다고 가정합니다. – Integer

답변

3

필자가 본 컴파일러와 예외 처리 메커니즘에는 차이가 없어야합니다. 예외가 던져지는 깊이는 차이를 만들 수 있지만 예외가 throw되고 일반적인 경우이 경우 성능은 일반적으로 무시할 수있는 것입니다.

+0

필자는 컴파일러의 구형 버전 중 일부는 시도를 여는데도 처벌이 있었지만 지금은 일을 이동하여 성능을 향상시키기 위해 예외 블록으로 이동 했으므로 개발자가 try 블록을 더 많이 사용하도록 권장합니다. – slf

+0

@slf : 자바의 경우입니까? 적어도 C++에서는 여전히 상당한 오버 헤드가 있습니다. (여전히 플랫폼에 따라 다름에도 불구하고) – jalf

+0

@ jalf : 실제로 Objective-C에 대해 말하고있었습니다. 불행히도 각 C++ 컴파일러의 특성을 잘 모르겠습니다. 스프레드 시트가 어딘가에 있습니까? 숫자가 – slf

2

성능 문제는 해결하지 못했지만 병목이 있다는 것을 알지 못하면 가독성이 더 중요하다고 생각합니다. 즉 :

정말 관련 statement1-5 방법에 따라 다릅니다. 5 단계로 수행되는 논리적 연산이 하나 인 경우 옵션 1을 선호합니다.

옵션 2의 try 블록 끝에 성공 플래그를 설정하는 것은 매우 추악하고 오류가 발생하기 쉽기 때문에이 옵션을 권장하지 않습니다. 케이스.

+0

+1 3이 예외를 throw 할 때 4와 5가 실행되지 않으면 옵션 2는 어떤 일이 일어 났는지 이해하기가 더 어려워집니다. –

+0

가독성에 관한 한 옵션 2가 더 읽기 쉽지 않습니다. 던지고있다. 나는 그것이 중요한 정보라고 생각한다. – Integer

+2

+1 옵션 2는보기가 어렵고 유지하기가 어렵습니다. –

1

옵션 1이 좋습니다. 라인의 일부가 던지지 않는 사실은 관련이 없습니다. 처음에는 코드를 살펴보기에 이상적입니다. 거기 그러나 무차별 모든 예외를 먹고 그들에게

이 무시에 대한 강의를 얻을 것이다

을 명중에는 반환 한 예외를 사용하는 코드의 계층에서 전환 할 때 얻을 불일치 가지의 유형이있다 없다 (심지어 그들을 포용)과 그렇지 않은 레이어가 있습니다. 그것은 위의 레이어가 예외처럼 보이지 않는 것으로 보이며 아래의 레이어는 예외로 보입니다. 위의 레이어가 예외를 좋아하지 않는 이유가 있습니까? statement3이 실패한 이유를 위의 계층에 설명해야하는 경우에는 어떤 일이 발생합니까? 그런 다음 코드 변환 함수를 반환하기 위해 무서운 예외를 작성해야합니다.

1

다른 사람들이 말했듯이,이 경우들 사이에 생성 된 코드에는 최소한의 차이 만 있어야합니다. 예외 처리의 "비용"은 스택이 풀릴 때 얼마나 많은 임시 객체가 파괴되어야하는지에 관련이 있습니다 (그리고 그 정도가 적 으면 코드가 실행해야하는 위치의 수). 이것은 스택 깊이와 함께, 예외가 던져지는 곳과 잡히는 곳 사이의 함수 호출의 수에 비례합니다. try 블록의 처음과 던져 사이에서 실행되는 명령어의 수는 아닙니다.