자택경비대

try/catch 구문에서 finally의 요점이 뭘까요?

stackoverflow

지난 몇년간 여러 프로그래밍 언어를 사용하면서 try-catch/except-finally 구문을 오래 사용해 왔습니다.
누군가 오늘 저에게 finally의 존재의의에 대해서 질문하였고, 저는 그것에 대해 대답할 수 없었습니다.

질문은 이렇습니다: try-catch 구문 이후에 코드를 작성하면 되는것을 굳이 finally를 사용할 필요가 있을까요?
혹은, 다음 코드에서 어떤 차이점이 있는지 말씀해 주실 수 있을까요?

try{ /* a */ }
catch { /* b */ }
finally { /* c */ }


try{ /* a */ }
catch{ /* b */ }
/* c */

finally 구문은 다음과 같은 3가지 상황 에서 catch 구문으로는 깔끔하게 처리하지 못하는 상황에서 빛을 발합니다:

  • 만약 try 안에 있는 코드에서 return을 할 경우.
  • catch 블록 안에서 잡아낸 예외를 다시 던지는 경우, 혹은 고의 혹은 실수로 새로운 예외를 던질 경우.
  • 만약 catch구문에서 잡아낼 수 없는 예외가 try 블록에서 발생 하였을 때.

물론 finally 구문의 코드를 각각의 return, throw 이전에 붙여넣고 catch 블록을 새로운 try/catch로 감싸서 새로운 예외가 던져질 가능성을 배제할 수 있겠지만, finally 구문을 사용하여 처리하는것이 가장 쉽고 깔끔한 방법입니다.