2010-11-26 1 views
3

예외 처리 및 자원 관리에 관한 질문이 있으며 누구나 의견을 나눌 수 있는지 궁금합니다. 나는 일련의 행동을 수행 할 필요가있다 : 앱 설정을 읽고, 환경을 설정하고, 물건을으로하고 결국 정리하라. 청소는 환경을 파괴하는 작업을 포함하지만 처음부터 성공적으로 설정 한 경우에만 수행해야합니다. 그래서 더 나은 솔루션을 찾기로 결정 조금 못생긴 듯 엉망으로 만들기 전에 청소합니까? finally 블록 내에 정리 코드를 넣을 때

try { 
readSettings(); 
setupEnvironment(); 
} catch (Exception ex) { 
logStackTrace(ex); 
displayError(ex); 
closeCommThreads(); 
return; 
} 

try { 
// do stuff 
} catch (Exception ex) { 
logStackTrace(ex); 
displayError(ex); 
} finally { 
teardownEnvironment(); 
closeCommThreads(); 
} 

:

여기 내 첫 번째 (그리고 절름발이) 접근 방식입니다. 나는 약간의 배경을 읽었으며 꽤 많은 기사가 더 큰 try/catch 블럭에 투표했고 정리를 위해 finally을 사용했다.

try { 
readSettings(); 
setupEnvironment(); 
// do stuff 
} catch (Exception ex) { 
logStackTrace(ex); 
displayError(ex); 
} finally { 
teardownEnvironment(); 
closeCommThreads(); 
} 

가 언제 호출 할 수 있도록 내가 teardownEnvironment()에서 순차적 커플 링을 제거해야이 작동하도록 - 전이나 setupEnvironment() 후 : 그래서 여기 내 두 번째 시도이다 (편집자 : 퍼팅 더의 방법). 이것이 올바른 접근 방법입니까? 나는 설정하기 전에 아래로 찢어지기 위해 약간 별 났다고 느낀다.

편집 :

은 그냥 좀 더 명시 적으로 만들려면 : 나는 여분의 teardownEnvironment 내부 검사 포함하여 순차적 커플 링을 제거 - if (!isSetup()) return; 같은 것을.

+0

중복 질문을 열지 않고 하단의 편리한 '편집'링크를 사용할 수 있습니다.) –

+0

예, 예 - 브라우저의 * 뒷면 *을 사용하여 두 번째로 실수로 게시했습니다./죄송합니다. 이봐, 적어도 마침내 * delete * 버튼을 사용할 기회가 있었음) – lukem00

+0

예, 삭제 버튼으로 인해 내 대답을 쓰지 않고 대신이 게시물을 찾을 수있었습니다. –

답변

1

음은 일반적으로 teardownEnvironment() 확인 할에 대한

isEnvironmentSetCorrectly() 또는 if(environment != null) 또는

유사한 당신이 무엇을 아래로 찢어 시작하기 전에.

올바르게 완료되면 일어날 일이 없으므로 " 약간 이상하게 느껴질 것""이 문제가 발생하지 않을 것입니다.

+0

그것은 - 내가 순차적 결합을 제거했다는 것을 의미하는 것입니다. 메서드 내에서 티 아웃을 호출하는 대신 명시 적으로 명시 적으로 체크하는 것이 낫지 않을지 궁금하다. – lukem00

2

두 방법 모두 수행하려는 경우 오른쪽 또는 이 잘못되었습니다.이 아닙니다.

두 번째 방법 (큰 try/catch/finally 블록)은 메서드 본문의 어딘가에있는 catch 블록에 "숨겨진"return 문이 없으므로 읽기가 더 쉽습니다.

또한, 방법 (teardown, setup) 간의 상호 의존성을 제거하는 것은 일반적으로 좋은 방법입니다 (예 : 이러한 방법을 개별적으로 단위 테스트 할 수 있음). 분해에서 불과 출구 아무것도 설치 적이있는 경우 - 그것은 :)

finally 접근 방식은 예외가 발생하기 전에, 사용 된 자원을 폐쇄 할 수있는 보증을하는 데 사용됩니다
2

/역 참조 (대한 이상한 느낌이 필요가 없습니다 쓰레기 수거 준비). 이것은 단지 exception safety을 홍보하는 것입니다.

여기에서 방금 설명한 내용을 Dispose Pattern이라고합니다. 기본적으로 Java GC의 자동 특성으로 인해 런타임 환경에 대한 자원 정리가 수행됩니다.

두 번째 방법을 사용하면 효과적으로 JVM GC가에 개막하기 ​​전에 모든 자원을 폐쇄 tearDownEnvironment()과 환경을 청소하고 같이 (A 폐기 패턴 인) 올

추가 정보 :. Resource Acquisition Is Initialization 너 계몽?