2011-09-15 2 views
4

이해할 수 있듯이 다음 두 예제는 똑같이해야합니다. 왜 1 위가 더 좋은가?finally 블록과 try/catch 블록 다음에 코드 작성하기 사용하기

1 :

try { 
    riskyMethod(); 
} 
catch(Exception e) { 
    //handle exception 
} 
finally { 
    cleanUp(); 
} 

2 :

try { 
    riskyMethod(); 
} 
catch(Exception e) { 
    //handle exception 
} 
cleanUp(); 

편집 : 예는 자바에 있지만 모든 언어에서 사용되는 나는 마침내 일반적으로 블록 a의 개념에 대해 궁금하네요

+0

@ 그레코 : 왜 C# 태그를 추가 했습니까? –

답변

12

"예외 처리"부분에서 예외 자체가 발생하면 정리가 발생하지 않습니다.

더 중요하게도, 당신은 거의 예외를 catch해야합니다. 처리 할 수있는 매우 구체적인 예외를 포착하고 다른 예외를 포착하게하십시오. 이 시점에서 이어야하며 정리가 계속 발생하려면 finally 블록을 사용해야합니다.

사용하는 언어가 명확하지 않지만 Java 인 경우 예외가 발생하지 않는 예외 (Throwable의 다른 하위 클래스)가 첫 번째 버전에서는 정리되지만 두 번째 버전에서는 정리되지 않으므로 차이가 있습니다. 그러나 일반적으로 Exception을 붙잡아서는 안됩니다.

개인적으로 나는 try/catch 또는 try/catch/finally 블록보다 try/finally 블록을 더 많이 작성합니다. 나는 꽤 희귀 한 것을 찾을 수있다. 예외 처리 ... 가끔은 하나의 예외를 잡아내어 하나의 추상화 수준에 맞춰서 변환하고 나서 다시 시작한다.

편집 : DJ 아킬의 대답 한 바와 같이 블록 예외없이 예컨대 완료되면 finally 문도 실행될 return 문을 사용하십시오. 내가 잊었던 사실은 finally을 선호하는 좋은 이유입니다. 일관성을 촉진합니다. 블록을 종료하는 방법에 관계없이 정리를 수행하는 일관된 장소입니다.

또한 C#에서 일회용 리소스에 대해 using 문을 idiomatically 사용합니다. Java 7에는 try-with-resources 문이 있습니다.

+1

"예외를 처리 할 수 ​​있다는 것이 꽤 드뭅니다." 어떻게 그래! 나는 똑같은 생각을하고있었습니다. – Andreas

+1

답장에 ** dj aqeel **을 언급하는 데 +1. –

+0

"거의 모든 예외를 잡아서는 안됩니다."- UI 레이어에서 사용자에게 간단한 친숙한 메시지를 출력하여 처리하려고 할 때 뭔가 잘못되었다는 것을 나타내는 것은 어떨까요? – BornToCode

0

"finally"는 여기에서 정리를 수행하고 있음을 나타내는 명확한 표시이기 때문에.

9

try 블록이나 catch 블록에 return 문, 예외 또는 다른 컨트롤을 남긴 경우에도 finally 블록의 코드가 항상 실행되기 때문에 마침내 시스템의 전원을 끄는 것 이외의 다른 경우에도 항상 실행됩니다 마지막으로 차단하기 전에. :)

+1

오, 잊어 버린 반환 진술 - 좋은. –

+1

John Skeet이 내 대답에 댓글을 달았습니다. 저에게 큰 상을 받았습니다 ... –

+0

실제로 'finally'가 실행되지 않는 많은 경우가 있습니다. 가장 확실한 것은'System.exit()'가 호출되거나 try 블록의 코드가 절대로 종료되지 않는다는 것입니다. –

관련 문제