2012-07-12 6 views
1

클래스 X가 있습니다. X 클래스의 method() 메소드 SomeException을 던졌습니다.정확하고 효율적인 프로그래밍 스타일

어떤 예외 처리 방법이 더 나은지 궁금합니다. try-block 메서드를 둘러싼 경우 예외 및 모든 종속성을 throw하거나 try-block 외부에서 종속성을 유지하지만 실패 후 메서드에서 반환합니다.

1.

public void test() { 
    X x = new X(); 

    try { 
      T temp = tx.method(); 
      temp.doWhatever(); 
    } 

    catch(SomeException e) { handleException(e); } 
} 

또는

2.

public void test() { 
    X x = new X(); 
    T temp = null; 
    try { 
      temp = tx.method(); 
    } 

    catch(SomeException e) { 
      handleException(e); 
      return; 
    } 

    temp.doWhatever(); 
} 

편집 : (주석 후)

나는 그렇게 내 코드를 더 무엇 undersand된다 excetuted됩니다 다음 일은 catch 그래서

1. tx.method()이 예외가 발생합니다 - 블록. temp은 여전히 ​​null입니다. 프로그램이 temp.doWhatever();으로 건너 뜁니다. 따라서 NullPointerException이 없으므로 매트가 없습니다. 나는이 두 가지 방법과 어떤 차이가 표시되지 null

+0

옵션 1이 내게 훨씬 더 분명해 보입니다 – Eric

+0

(1) 왜 '공개 무효 테스트'이고 다른 하나는 '공개 정적 무효 메인'입니까? (2) 두 번째 코드 블록에서 'temp.doWhatever'는 예외가 잡히지 않는다는 것을 알 수 있습니까? –

+0

@notfed : 귀하의 질문 (2)에 대해, OP는 doWhatever에 대해 아무 말도하지 않았지만 Exception을 던졌습니다. (아무 것도 던지지 않을 것이라고 가정 할 수 있습니다). – nhahtdh

답변

0

temptry 블록 외부에 표시되지 않으므로 두 번째 사례는 컴파일되지 않습니다 (심지어 의미가 없습니다). 어떤 경우에는,이 갈 것입니다 : temp를 초기화하는 것은 실패 할 경우 temp 작업의 나머지 부분이 실행되지해야

public void test() { 
    X x = new X(); 

    try { 
      T temp = tx.method(); 
      temp.doWhatever(); 
    } 

    catch(SomeException e) { handleException(e); } 
} 

입니다.

+0

"초기화하는 데 실패하면 나머지 임시 작업을 실행해서는 안됩니다." 나는 두 번째 예에서 돌아온 이유에 동의합니다. – squixy

+0

@ suquixy : 이제 두 개의 발췌 문장이 동일합니다. 코드에서 어떻게 동작하는지 이해하기가 조금 더 어렵 기 때문에 메서드에 흩어져있는 return 문을 사용하지 않는 것이 좋기 때문에 첫 번째 메서드를 선택합니다. – Tudor

-1

입니다 temp.doWhatever()temp 때문에 실행하지 않기 때문에

2. 여기에 내가 return 명령을 사용합니다.

+0

그들이하는 일에는 아무런 차이가 없습니다 ... 그러나 이것은 _ 코딩 스타일 _ 질문입니다. 그것이 요점입니다. – Eric

1

temp가 내부에 선언되어 있기 때문에 첫 번째 만 가능합니다.

개인적으로 첫 번째를 선택합니다. 그렇지 않으면 try : T temp = null 앞에 선언해야합니다. 첫 번째 코드는 덜 점프 명령을 가지고 있으며, 변수 temp 더 많은 지역이며, 널 (null) 초기화없이

프로 첫째 :


질문의 보정 후.

또한 코딩 스타일은 null 초기화없이 오류 지점이 될 수 있으므로 더 간단합니다.

예외는 예외로 유지해야합니다. 첫 번째 버전을 읽기가 더 쉽습니다. 예외는 선형 코딩 및 읽기 프로세스를 방해해서는 안됩니다.

프로

예외가에서 줄기 수있는 곳이 더 분명하다.

+0

이제 편집되었습니다. – squixy

1

예외가 작동하는 주요 요점 중 하나는 스타일 번호 1을 사용할 수 있다는 것입니다. 코드 블록이 중단되는 곳마다 흐름이 중단되고 오류가 처리된다는 것을 마음의 평화로 실행 시키십시오. 그래서 저는 항상 첫 번째 스타일을 조언 할 것입니다.

0

메서드에서 반환하는 것이 좋지 않습니다. 하지만 이해할 수있는 코드 만 있으면됩니다. 부울 및 ifs와 함께 반환을 피할 수 있습니다.

효율성 문제가 없다고 생각합니다. 첫 번째 문에서 예외가 발생하면 두 번째 문은 실행되지 않습니다. 예외가 없다면 ... hm ... 나는 두 번째 방법 때문에 오버 헤드가 없어야한다고 생각합니다. try catch와 같이 "어셈블러"코드가 어떻게 생겼는지 알려줄 수 있습니다. D

제 생각에는 undestandable 코드를 작성하는 것이 더 중요합니다. 컴파일러는 요즘 매우 좋고 대부분의 것을 아주 잘 최적화합니다.

0

옵션 2는 확장 성 측면에서 좋지 않습니다. 나중에 누군가 예외적 인 경우가 발생하더라도 test()가 test.doWhatever() 다음에 수행해야한다고 결정했다고 가정합니다. 이 시점에서 옵션 1의 코드를 리팩토링해야합니다. 옵션 1을 처음부터 사용하는 데 비용이 들지 않으므로이를 수행해야 할 이유가 없습니다.

또한 try/catch 블록의 디자인 원칙은 컴파일러에서 여전히 허용하더라도 catch 블록에서 반환하면 위반됩니다. catch가 복귀 지점이 되려면 예외가 발생하여 조치가 호출되므로 예외를 throw해야합니다.

관련 문제