| [ CnUnix ] in KIDS 글 쓴 이(By): quack (승진아자씨) 날 짜 (Date): 2003년 6월 5일 목요일 오후 06시 17분 59초 제 목(Title): Re: c++ exception handling (윈도, 유닉스 exception handling에 대한 이해는 ingee님을 쿠사리 주는 분들 보다 ingee님의 것이 더 정확함. 1) try가 무책임한 코드? 모든 정상적이지 못한 상황은 if문으로 검출하여 대처가 가능함. c 프로그램을 보면 함수를 호출한 후 정상적으로 실행되었는지 확인하기 위해 리턴값을 확인하는 if문을 여기저기서 볼 수 있음. 이런 비정상적 상황에 대처하기 위한 코드의 양이 오히려 더 많아 배보다 배꼽이 더 크고, 또 정상적인 로직을 구성하는 코드 중간 중간에 섞여있어 가독성을 떨어뜨리고, error propagation의 문제점이 발생하고.. 등등 이런 문제점을 해결하기 위한 것이 c++의 exception handling. 에러 검출 및 대처를 위한 if문을 정상 로직에서 제거하여 따로 모아 짜서 가독성을 높이겠다는 것. 비정상적인 상황에 대처하는 코드를 안짜겠다는 것이 아니고 try 블럭의 정상 로직과 분리하여 catch 블럭으로 따로 모아 짜겠다는 것. 무책임한 코드를 짜겠다는 말이 아님. 2) divide by zero를 exception으로 하면 안되나? java나 c#처럼 exception handling을 지원하는 언어라면 divide by zero도 exception이 발생하여 대처 코드를 주 로직 사이에 if문으로 주렁 주렁 매달 필요 없이 catch 블럭에서 따로 짤 수 있어야 바람직함. 그런데 c++에서는 java c#과는 달리 다음과 같은 언어 설계의 목표가 있음. - arithmatic 부분은 c와 동일하여야 한다 - system level의 이벤트를 abstraction하지 않고 그대로 노출한다. divide by zero도 일종의 system level의 이벤트이므로 c++에서는 처리 안하는 쪽으로 선택함. 선.택.임. 3) 컴파일러가 divide by zero를 검사하는 코드를 나누기 명령 마다 추가? divide by zero 이벤트는 대부분 하드웨어에서 발생하여 시스템에 통보되고 어플리케이션으로 전달됨. 이 이벤트를 가로채어 처리하는 코드만 생성하는 것임. 4) 왜 VC++은 divide by zero를 exception으로 처리하는데 g++은 안하나. 정답은 없음. 어디까지나 선.택.임. divide by zero와 같은 system level 이벤트의 처리 방법은 플랫폼 마다 다 다르므로 이식성을 추구하는 g++에서 이를 구현하는 것은 큰 부담일 테지만 VC++은 이런 부담이 없음. 이식성은 생각보다 중요한 이슈임. 예를들어 heavily pipelined architectures에서 divide by zero는 asynchronous한 이벤트임. 5) g++에서 divide by zero를 exception으로 처리하려면? Zaharang님의 글. |