|
안녕하세요. 로크(locke)입니다.
c빌더로 업무개발중 아래와 비슷한 코딩을 하게되었습니다. (c빌더 6입니다)
일단 아래를 봐주세요.
while(true)
{
try
{
break;
} catch(Exception &e)
{
ShowMessage("Error");
} //catch
} //while
int *a = null;
*a = 54; <-오류 나는 부분(이해를 쉽게하기위해 인위적으로 오류 발생)
while루프안에 try-catch블럭이 있는데
try블럭안에서 break로 루프를 탈출합니다.
루프밖에서 연산오류가 발생하면 루프안의 catch(exception handler)로 프로세스가 이동하여 "Error"라는 오류창을 띄워줍니다.
고로 이 프로그램은 오류창 확인해주면 또 오류나고 무한루프가 되어버립니다.
어떤 한 블럭안에서 오류가 나면 c++컴파일러는 그것을 처리할 수 있는 이벤트 핸들러를 찾아서 넘겨주고
그게 없으면 어플리케이션 오류를 발생시킬텐데
위의 예제를 보면..약간 좀 아이러니합니다.
제가 가만히 생각해보니 try문을 만날때 사용자의 이벤트 핸들러(=catch)를 스택상에 -이미 오류나면 분기할 부분을- 저장하고 있다가 루프안에서 break로 그 블럭을 빠져나올 때
오류시 분기부분을 스택에서 해제하지 않았고 그 이유로 블럭밖에서 오류가 났음에도 불구하고
해당 이벤트 핸들러로 정의된 catch문으로 분기를 하는것 같습니다.
이거 c++빌더 컴파일러의 버그일지? 아니면 c++랭귀지는 모두 다 이렇게 되는건지..
다른 분들은 어떻게 생각하시나요? 여지껏 코딩하면서 이런 경우는 처음 봅니다.
-locke
|