본문 바로가기
programing/C++

exit(), assert(), 에러처리

by RedWiz 2016. 12. 27.

- void exit(int status); // 프로그램을 종료

// 성공시 EXIT_SUCCESS, 실패시 EXIT_FAILURE를 인수로 넣음


- assert(표현식) : 코드가 정확하기 동작할 수 있는 상황이라는 것을 확인

> 표현식을 인수로 전달 받아 참, 거짓을 점검

> 조건이 참이면 이 함수는 아무 일도 하지 않음

> 거짓이면 에러 발생 위치와 표현식 등으로 구성된 상세한 에러 메시지와 함께 강제로 종료

> 콘솔 프로젝트는 stderr 표준 출력으로 나타나지만, 그래픽 프로젝트에서는 대화상자로 출력

> 프로그램이 죽은 위치보다는 에러의 원인이 될만한 곳에 사용하여 미리 오동작 발견

> 조건부 컴파일로 정의되어 있는 매크로 함수 -> 프로젝트의 성능이나 크기와 상관이 없음


- assert문 주의 사항

> 디버거 버전에서만 컴파일 되므로 assert의 인수로는 생략해도 상관없는 조건식만 넣어야 함

> 절대로 발생해서는 안되는 조건에 대해서 사용하는 것 -> 정상적인 에러 상황을 처리하지 않음

(프로그램 종료가 필요하지 않은 경우는 사용하지 않고 if문으로)

> 가급적이면 한 조건당 하나의 assert를 사용하는 것이 좋음


- static_assert("constant-expression", "error-message"); // Modern C++

> 기본 타입이나 유저 정의 타입의 크기를 확인 하고 싶을 때 사용

> 어떤 타입의 최대 크기를 넘어서는 지 확인하고 싶을 때 사용

> 컴파일 타임 때 사용하여 프로그램 실행 전에 문제를 찾을 수 있음

> 템플릿 프로그래밍에 사용하면 특히 유용


[SEH(Structed Exception Handler)]


- Hardware Exception

> 하드웨어에서 인식( ex. Divide by zero )

> 예외를 알려주는 주체는 CPU가 담당


- Software Exception

> 소프트웨어에서 감지

> 개발자가 담당


- 종료 핸들러

> __try영역을 빠져나오더라도 __finally블럭이 반드시 실행

> ExitProcess, ExitThread, exit() 호출로 강제 종료시 실행 안됨

> RaiseException() : 직접 예외 발생

__try

{}

__finally

{}


- 예외 핸들러

> 예외가 발생하면 자동으로 __except 구문이 실행

> GetExceptionCode()로 예외가 무엇인지 알 수 있음

__try

{}

__except(EXCEPTION_EXECUTE_HANDLER)

{}


- try, throw, catch

> try : 예외가 발생할 만한 코드 블록을 지정, 블록에서 예외가 발생했을 때 throw 명령으로 예외를 던진다.

> throw : 예외를 던지며 throw 다음에 던지고자 하는 예외를 적는다. 예외를 던지면 예외가 발생 되었다는 것을 알리며, 이 예외를 처리하는 catch문으로 점프하도록 한다. throw 아래 코드는 모두 무시 (타입에 따라 오버로딩 됨, call 보다는 goto와 가까움)

> catch : try 블록 다음에 이어지며 던져진 예외를 받아 처리. catch블록을 예외 핸들러라고 함. catch 다음에는 throw에서 던져지는 예외 타입을 적음

try

{

if(예외조건) throw 예외객체;

}

catch (예외객체)

{

예외처리;

}

> 함수 안에서는 throw만 사용해도 됨

> 중첩 가능


'programing > C++' 카테고리의 다른 글

음성 채팅 구현  (0) 2017.01.20
[Modern C++] RValue Reference  (0) 2016.12.29
형변환 연산자 오버로딩  (0) 2016.12.06
explicit  (0) 2016.12.05
Effective C++  (0) 2016.12.04