effective C++ 항목 8, "예외가 소멸자를 떠나지 못 하도록 붙들어 놓자" 쪽 보다가 try~catch문 발견. 가물가물해서 정리 겸 게시하게 되었다.

 

 

개요

C++에서의 예외 처리를 구현하기 위함.

 

 

방식

예외가 발생할 수 있는 한 개 이상의 구문을 try 블록으로 감싼다. throw 표현은 try 블록에서 생긴 예외 상황을 표현한다. 대부분 경우 std::exception 클래스 또는 그 하위의 클래스를 사용하기를 권장한다.

 

 

 

예제

생성자 초기화 리스트 작성 중, 에러 처리 기능을 try 블록으로 작성

class Position
{
private:
     int x,y;
     char ch;

public:
     Position(int ax, int ay, char ach)
     try : x(ax),y(ay) {
          if (ax < 0) throw ax;
          ch=ach;
     }

     catch (int a) {
          printf("%d는 음수 좌표라 객체가 보이지 않습니다.\n",a);
     }

     void OutPosition() {
          gotoxy(x, y);
          putch(ch);
     }
};

void main()
{
     try {
          Position Here(-1,10,'X');
          Here.OutPosition();
     }
     catch (int) {

          puts("무효한 객체임");
     }
}

 

 

 

이 표기법이 꼭 필요한 이유는 초기화 리스트 실행중에 발생할 수 있는 예외까지도 처리할 필요가 있기 때문이다. 기존의 일부 코드만 감싸는 try 블록 표기법으로는 본체 코드 전체를 감쌀 수는 있어도 초기화 리스트까지 예외 처리 블록에 포함시킬 수는 없다.
 
 기반 클래스로부터 상속받은 멤버를 초기화한다거나 포함된 객체를 초기화하는 중에 예외가 발생할 가능성은 아주 많다. try 블록 함수 형태로 생성자를 작성하면 초기화 리스트의 코드도 try 블록에 포함되므로 좀 더 광범위한 예외 처리를 할 수 있다.

 만약 이 처리를 생략하면 생성자에서 발생한 예외는 미처리 예외가 되어 프로그램이 다운된다.

 

 

ref

https://docs.microsoft.com/en-us/cpp/cpp/try-throw-and-catch-statements-cpp?view=msvc-170 

 

try, throw, and catch Statements (C++)

Learn more about: try, throw, and catch Statements (C++)

docs.microsoft.com

http://www.soen.kr/lecture/ccpp/cpp3/32-2-5.htm

 

혼자 연구하는 C/C++ by WinApi

32-2-마.try 블록 함수 어떤 함수의 본체 어느 곳에서나 예외가 발생할 수 있다면 이 함수의 본체를 try 블록으로 완전히 묶어야 한다. 다음 예제의 divide 함수는 길이가 무척 짧기는 하지만 연산중

www.soen.kr

 

'개인 공부 > C++' 카테고리의 다른 글

[c++] std::back_inserter  (0) 2022.09.23
[effective C++] 1~4  (0) 2022.07.14
SafeInt 라이브러리  (0) 2022.05.20
범위 기반 for문  (0) 2022.05.19
변환 생성자와 explicit  (0) 2022.05.16

+ Recent posts