C++ Chapter 14.5 : 함수 try

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 14. 예외처리 : 함수 try

🔔 함수 try 사용 X

#include <iostream>
#include <exception>

class A
{
private:
    int m_x;
public:
    A(int x) : m_x(x)
    {
        if (x == 0)
            throw 1;
    }
};

class B : public A
{
public:
    B(int x)
        : A(x)
    {}
};

int main()
{
   try
   {
       B b(0);
   }
   catch (...)
   {
       std::cout << "Catch in main()" << std::endl;
   }
   
   return 0;
}
💎출력💎

Catch in main()
  • main 에서 B b(0)
    • B 클래스의 생성자에서 부모인 A 클래스의 생성자를 호출한다.
      • A 클래스에서 x 가 0 이므로 예외를 발생시키고 1 을 trhow 한다.

A 생성자에서 발생한 예외를 (A 생성자를 호출한 B 생성자를 호출한) main이 아닌 그냥 바로 B 생성자 아래에서 예외를 catch 하고 싶다면?

  • 👉


🔔 함수 try 사용 O

#include <iostream>
#include <exception>

class A
{
private:
    int m_x;
public:
    A(int x) : m_x(x)
    {
        if (x == 0)
            throw 1;
    }
};

class B : public A
{
public:
    B(int x) try 
        : A(x)
    {}

    catch(...)
    {
        std::cout << "Catch in B constructor" << std::endl;
    }
};

int main()
{
   try
   {
       B b(0);
   }
   catch (...)
   {
       std::cout << "Catch in main()" << std::endl;
   }
   
   return 0;
}
💎출력💎

Catch in B constructor
Catch in main()

B(int x) try 👉 이렇게 함수 뒤에 try를 붙여주면 된다.

  • B(int x) 함수(생성자도 함수!) 전체가 try로 묶인 효과를 가진다.
  • 따라서 B 생성자 아래에 있는 catch(...)에서 호출한 A 생성자에서 발생한 예외를 스택 되감기를 통해 받게 된다.
    • “Catch in B constructor” 출력
    • 근데 이 catch(...)문 안에 throw가 명시 되어있지 않은데도 불구하고 시스템 상으로 또 다시 throw가 던져져 main 함수의 catch(...)가 이를 받게 된다.
      • 함수 try의 예외를 받는 catch 에서 한번더 throw;하고 예외를 던지는 특징이 있다.
      • 일반 try였으면 예외 처리 끝났으니 실행되지 않았을텐데!

함수 try 특징 정리

  1. 함수 하나 전체를 try로 묶는다.
  2. 함수 try의 예외를 받은 catch에선 명시되있지 않아도 한번 더 예외를 throw한다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기