*지금 내용은 How to Programming C++를 요약한 내용입니다.
1. 예외(Exception)란? - 프로그램을 실행하는 도중에 발생하는 문제점이라고 할 수 있습니다.
2. 예외처리(Exception handling)란?- 위에서 언급한 예외를 프로그램 상에서 예외를 처리할 수 있게 해주는 기능입니다.
- 꼭 처리가 안되더라도 프로그램 종료전 사용자 및 개발자에 알림으로써 더욱더
유지 및 보수에 더욱 더 효율성을 부여한다고 볼 수 있습니다.
3. 예외의 종류- 동기적 오류(Syncronous error) : 문장이 실생될 때 발생되는 동기적 오류
( 0으로 나누기, 배열인덱스범위 관련, 메모리 할당 실패...)
- 비동기적 이벤트(Asunchronous event) : 프로그램 외적인 요소에서 일어나는 이벤트
(I/O관련, 네트워크, 마우스클릭, 키누름)
4. 프로그램을 작성하는데 있어, 미리 다른사람에 의해 만들어진 컴포넌트와 자신이 만든
어플리케이션이 합쳐져서 만들어진 프로그램이 많을 것입니다.
이런 경우를 대비햐여 실제로
외부 인터페이스 컴포넌트에서 넘어온 예외를 처리할 수 있는 부분을 만들어놔야 합니다.
5. try ~ catch ~ throw- try {} : 예외가 발생할 수 있는 코드를 try블럭으로 감싼다. 실제 예외가 발생되는 지점을
throw point라고 합니다.
- catch() : 예외가 발생되는 즉시 ()안에 처리할 수 있는 매개변수를 입력받아 처리합니다.
- 여러개의 catch문이 존재할경우 바로 찾아가서 실행하는 것이 아니라 try블록 다음부터 순서대로
catch문을 검색하여 적합한 catch문을 실행하게 됩니다.
- throw : 말그대로 예외가 발생할 것 같으면 예외를 throw(던진다라는 뜻이죠?)해서
catch(받으세요)하게 만들어 줍니다. throw point를 지정해준다고 볼 수 있습니다.
6. 스택풀기(Stack Unwinding)- try블록에서 발생된 예외에 해당하는 catch문이 없거나, try블록밖에서 예외가 일어날 경우,
해당하는 함수는 즉시 종료되고 프로그램 내의 try블록으로 이동하게 됩니다.
이를 스택풀기라고 합니다.
- 실제 함수의 호출 순서에 따라 스택구조에 의해 함수공간이 주어지기 때문에 단계적/절차적
예외처리가 가능합니다.
예제1)
- 컴파일 결과
- 그런데 재미있는 일이 생겼습니다. 15번째 줄에 exception()의 활용이 컴파일러마다 다름을 알 수
있었습니다. 헤더파일을 찾아본 결과 형식이 틀림을 알 수 있었습니다. 실제 g++기반으로 하고
있는 (현재 제가 쓰고 있는 툴이죠) exception같은 경우에는 문자열을 받는 생성자가 없습니다.
하지만 Visual계통의 컴파일러가 가지고 있는 라이브러리에는 예2)와 같은 형태를 허용하고
있었습니다.
예1) g++ 기반의 dev-c++ class exception
{
public:
exception() throw() { } virtual ~exception() throw();
/** Returns a C-style character string describing the general cause * of the current error. */ virtual const char* what() const throw();
};
예2) Visual C++의 헤더의 일부class _CRTIMP_PURE exception
{ // base of all library exceptions
public:
#ifdef _M_CEE_PURE
__CLR_OR_THIS_CALL exception()
: _m_what(NULL), _m_doFree(0)
{ }
__CLR_OR_THIS_CALL exception(const char *const& _What) {
if (_What != NULL)
{
- 그럼 g++에 맞게 고쳐서 되는지 확인해 보겠습니다.
예제2)
- 실행결과