C++ try catch 어디까지 가봤니

Preview:

Citation preview

어디까지가봤니?

NHN NEXT 隱者林

JAVA에서 쓰는 게 아니었나?C++에도 Try – Catch가 있었나?...

그럼요!우리가교과서로사용한뇌를 자극하는 C++에서무려 한 챕터를 할애하는데

그래도 좀 다른 것 있음!

Throw가있고, 다른함수내에서도던질수있다는것

얼핏 보면…가독성도있고몰아서 처리하는것도 괜찮고

‘오 이거 써야 겠다!’생각하기쉽다

하지만 “쓰지 말라!”

• 프로그램 성능이 눈에 띄게 느려진다(스택 되감기 등 때문에)

• 프로그램 용량도 커지게 된다• 동적 할당한 메모리가 해제 안될 수 있다

• 결정적인 에러를 못 찾는 경우 있다

throw 발생 스택 프레임

Main 스택 프레임

리턴

함수실행중 throw를만나면대응되는 catch를찾기 위해 호출원으로거슬러 감(스택되감기)

1. 함수나객체를스택에쌓았고그후 throw를 부르면2. 호출한함수에서 catch를찾는다3. 2번에서없으면이전스택으로리턴4. 상위스택에서 catch를찾는다5. 찾을때까지반복

상위 함수 스택 프레임

리턴

…리턴

더 보기 전 함수에 대해 생각해보자

함수가호출될때는스택에각 함수의스택프레임이생성호출직전호출함수(서브루틴)가끝나고돌아올주소를호출스택(call stack)에넣음

호출스택에들어가는정보• 서브루틴종료직후돌아갈주소• 지역변수• 매개변수

함수가리턴할때스택프레임은정확하게호출직전으로돌아감즉, 호출스택에있는정보는 throw 발생시전부정리됨

이 함수를 한 번 까봅시다

Try 내부 calc 수행되기전함수스택프레임생성후함수 call 진행

Stack 상에서 서브 루틴이호출 되고Exception이발생

나머지 영역에대한 정보를 전부정리하고바로상위 함수(main)의 catch로전이

동시에 해당스택의 오류 정보도같이 날아감

왜중간에있던오류들이사라지는가?

저수준의 interface를정의한 ABI에 따라 try-catch 문에서오류 정보가 정리된다그로인해오류들이사라지게 된다

ABI?• Calling Convention을다룬다

(함수의인자들과리턴값이어떻게넘겨지고반환되는지를다루는호출규약)

• C++ name mangling을다룬다• 예외 전파를다룬다

결론은?

SHE(Structured Excetpion Handle) 씁시다.

SHE 관련 예제는• Sm9님의 easyserver 참고• http://blog.naver.com/gloryo?Redirect=Log&logNo=110078890491 참고

Q & A