케이스윔의 개발 블로그

[PL] Exception handling(예외 처리) 본문

Study

[PL] Exception handling(예외 처리)

kswim 2018. 12. 15. 20:17
  • Error: 컴파일 시 문법적인 오류나 런타임 시 NullPointer 참조와 같은 오류로 프로세스에 문제를 일으켜 프로세스를 종료시킬 수 있는 경우를 말합니다.(PL에서는 Unchecked Exception이라고도 합니다.)
  • Exception: 프로그램 동작 도중에 예기치 않은 이상 상태가 발생하여서 수행 중인 프로그램이 영향을 받는 경우를 말합니다.(PL에서는 checked Exception이라고도 합니다.)

  • Exception handling은 예외발생으로 인해 실행중인 프로그램이 비정상적으로 종료하는 것을 막고 정상적인 실행을 할 수 있도록 하는 작업입니다.

  • Traditional Error Handling: 어떠한 함수를 호출하면 호출한 곳에서 함수의 return 값을 보고 에러가 났는지 아닌지를 체크하고 처리를 합니다. 이렇게 되면 반드시 항상 호출을 해야하기때문에 상당히 많은 코드를 필요로 하게 됩니다. C언어에서는 대부분 이러한 방법이 사용됩니다. (어떠한 에러가 났을 때 jump 명령을 통해서 에러를 처리를 하기도 하는데 에러가 발생해서 jump를 하게 되면 다시 돌아갈 수 없습니다.)

  • 발생가능한 에러에 대해서 처리를 해줄 수 있을 때 try-catch 문을 통해서 예외처리를 해줄 수 있고, throw문 통해서 호출한 메서드에 처리를 넘길 수도 있다.
  • try문 안에서는 에러가 발생할 수도 있는 코드를 작성하고, catch문에는 에러를 회복할 수 있는 작업, 에러 로그나 사용자들에게 알림을 제공하는 등의 코드를 작성하며 비어있게 하면 안됩니다.
  • catch문 안에서 Re-Throw를 할 수도 있는 데 이 경우는 예외가 발생한 메소드와 이를 호출한 메소드 양쪽에서 모두 처리해야할 작업이 있을 때 (호출한 메소드에서 해당 에러에 대한 정보를 알고 싶을 경우) 사용할 수 있습니다.
  • try-catch문 이후에 finally문을 통해서 thread locks을 풀거나, Release resources와 같이 마지막으로 수행해야하는 일들을 처리할 수 있습니다.

  • 이러한 코드들을 작성하면 에러를 다루는 코드를 분리할 수 있고 프로그램 코드를 읽고 수정하기에 편리하다는 장점이 있지만 이런 에러에 대한 코드를 작성하기 위해 더 많은 시간과 자원이 소요된다는 단점이 있습니다.

  • Throw early, catch late! 말 그대로 Throw는 빨리하고 catch를 빨리 하는 것이 효과적인 예외처리라고 합니다. 만약 NullpointerException과 같은 unchecked Exception이 발생할 경우가 있다면 최대한 빨리 throw를 통해 어느 지점에서 발생했는지를 찾는 것이 좋고, 그렇지 않은 경우 checked exception이라면 callee에서는 최대한 수행을 하도록 하고 caller에서 예외처리를 이후에 해주는 것이 좋다는 뜻입니다.


Comments