Chapter 10 예외 처리

핵심 개념

  1. 예외 처리 기본: try, throw, catch문을 중심으로 예외 처리를 구성하는 방법
  2. 스택 풀기: 스택 메모리에 불필요한 데이터가 쌓이지 않게 하려는 예외 처리 구조
  3. 메모리 예외 처리: 객체가 생성 혹은 소멸하는 과정에서 발생하는 예외

    학습 목표

  4. 예외 처리의 중요성과 기본 구조를 정확하게 이해
  5. 함수 실행에서 발생하는 상황에 대처하는 스택 풀기 이해
  6. 객체 생성과 소멸에서 발생하는 상황에 대처하는 메모리 예외 처리 방법



1. try, throw, catch문

  • 구조화된 예외 처리: 함수 호출로 변경된 것들을 한 번에 되돌릴 수 있는 방법
    • 스택을 본래 형태로 돌리는 것
  1. 기본 활용 방법
    try
    {
     .... //작업
     if(error 발생)
         throw errocode;
     if(error 발생)
         throw errocode;
    }
    catch(int nExp)
    {
     ...
    }
  • goto문: statement label를 명시해준 곳으로 점프한다.
tryAgain: 
    // this is a statement label
    std::cout << "Enter a non-negative number"; 
    std::cin >> x;
    if (x < 0.0)
        goto tryAgain;
    // this is the goto statement


    // c++ 에서는 적절하지 않은 명령이다.
    // 자칫 스파게티 코드를 작성할 수 있다.
    // c나 오래된 언어에서 사용함
  • goto문과 try-catch 문의 차이
    • goto문에선 if문 내에서 예외가 발생할 경우 블록 내 실행을 완료하고 넘어감
    • try-catch에서는 중간에 예외를 발생하게 될 경우 곧바로 catch문 블록으로 넘어감
      • 예외 처리 문을 사용함으로 예외 처리 코드를 '구조적'으로 코드를 짤 수 있음
  • 예외 처리를 하는 이유
    • 정상 처리문과 예외 상황을 분리함으로써 구조를 간결하게 하기 위함
    • 정상 처리하는 상황을 묶어서 관리하고, 예외 상황을 따로 빼서 관리하게 되면 실수를 줄일 수 있다.

  1. catch 다중화
  • catch문을 여러개로 구현 가능함

  • 예외를 던질 때 자료형이 다른 경우 각 상황에 맞게 catch가 가능하다.

      int nun;
      char ch;
    
      cin >> num >> ch ;
      try
      {
          if(num < 0>)
              throw num;
          if(ch != 'A')
              throw ch;
      }
    
      catch(int nExp)
      {
          cout <<"Error_int: " << nExp << endl;
      }
    
      catch(char ch)
      {
          cout <<"Error_char: " << ch << endl;
      }
  • 더 깔끔하게 볼 수 있다.

  • 예외 처리를 중첩으로 사용이 가능함



  1. 예외 클래스
  • 예외 처리에 사용자 정의 클래스도 catch가 가능하다.
    • 단순 자료형으로는 구체적인 메시지 또는 추가적인 정보를 담을 수 없다.
  • 장점
    • 프로그램 내부에 만들어야 하는 모든 예외 정보를 한 클래스로 묶을 수 있음
    • 각종 오류를 포함한 예외 상황들을 정책적으로 관리
    • 디버깅하기가 수월하다.


      2. 스택 풀기

  • 호출 스택: 함수를 호출하면 매개변수, 자동 변수, 기타 추가정보가 스택 메모리에 쌓이는데 이를 디버거에서 보여준다.
  • 자동 변수: 스택을 사용하는 변수
  • 함수를 호출하다 에러가 발생하여 throw를 던지면 스택 메모리는 함수를 호출하기 전 상태로 돌아온다.


    3. 메모리 예외 처리

  • 메모리가 너무 많은 양을 할당하려고 하면 오류가 남
  • 메모리를 할당해주는 함수나 연산자는 NULL을 반환하고 반환 값이 NULL인지 비교하는 방식으로 메모리 예외 처리를 시도한다.
    catch(bad_alloc &exp)
  • bad_alloc 을 통해 메모리 오류를 받는다. 그리고 예외 처리를 실행함
  • bad_alloc 클래스는 exception 클래스의 파생 클래스이며, what()메서드를 통해 운영체제가 알려주는 메시지를 볼 수 있다.





    연습문제

  1. Stack unwinding에 대해 설명
    • 함수를 호출하고 실행하던 중에 에러가 발생하면 throw를 던지고 스택 메모리가 함수를 호출하기 전 상태로 돌아가는 것
  2. bad_alloc에 대해 설명
    • 함수나 연산자가 너무많은 메모리를 할당하는 연산을 수행할 때 에러를 예외 처리를 실행한다.

      이 클래스는 exception의 파생 클래스이며, 운영체제가 예외 발생 원인을 알려주는 what 메서드를 통해 원인 파악이 가능하다.

'C++ > 이것이 C++이다.' 카테고리의 다른 글

Ch7. 상속 심화  (0) 2021.01.15
Ch6. 상속 기본  (0) 2021.01.15
Ch5. 연산자 다중정의  (0) 2021.01.15
Ch4. 복사 생성자와 임시 객체  (0) 2021.01.15
Ch3. 클래스  (0) 2021.01.15
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기