상세 컨텐츠

본문 제목

예외처리(Exception)

C++/예외

by nowpassion 2008. 5. 10. 16:22

본문

*지금 내용은 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)
사용자 삽입 이미지

- 실행결과
사용자 삽입 이미지










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

Stack Unwinding(스택풀기)  (0) 2008.05.10
예외 명세  (0) 2008.05.10
예외 재발생  (0) 2008.05.10

관련글 더보기