C++ 예외처리(exception) try catch 사용법

C++에서 예외 처리를 하는 방법에 대해 알아보겠습니다.

프로그램에서 예외란 문법적인 오류가 아닌 처리가 동작을 하며 의도하지 않은 방향으로 흘러가 시스템이 멈추는 오류를 뜻합니다.

소스를 작성할 때 어느 정도 동작을 예상하고 테스트를 하며 만듭니다.

하지만 예상하지 못한 동작을 해 생각하지 못한 값이 들어오는 경우 다른 결과를 내기도 하지만, 결과조차 내지 못하고 시스템이 멈추는 경우가 생겨버립니다.

시스템이 멈춰버리거나 갑자기 종료가 된다면 사용자는 오류가 있어서 시스템이 종료가 된 건지 정상적으로 끝난 것인지 알 수 없습니다.

예상치 못한 오류가 발생해 시스템이 멈추거나 종료되는 거 보다는 오류가 발생했다가 알려주는 것이 중요합니다.

예외가 발생한 경우 처리를 할 수 있게 준비되어 있는 문법이 try catch입니다.

 

try catch

try catch의 작성 방법을 보겠습니다.

// 예외 발생하는 영역
try {

  // 처리 작성 부분
  ...;
  
  // 예외가 발생하면 예외를 던지는 영역
  throw 예외 객체 ;
  
  // 처리 작성 부분
  ...;

// 던져진 예외가 있는 경우 처리 영역
} catch(예외 객체) {

  // 예외 처리 부분
}

 

try – try 블록 내부에 예외가 있는지 감시

throw – try에서 예외를 감시하면 throw에서 catch로 인자를 전달

catch – throw에서 던진 변수를 인자로 받아서 catch 블록 내부에 작성한 예외처리 실행

 

샘플 소스를 보면서 try catch에 사용 방법을 보겠습니다.

#include <iostream>

using namespace std;

int main()
{

    int a = 9;
    int b = 0;
    int rs;
    
    rs = a/b;

    printf("결과 : %d\n", rs);
  
}

 

예제 소스에서는 9를 0으로 나누고 있습니다.

0으로 숫자를 나누려고 하면 에러가 발생합니다.

이러한 경우 대부분 시스템 에러가 표시가 됩니다.

만약 0이 들어오는 경우 try catch를 사용해 예외 처리를 하는 방법을 보겠습니다.

#include <iostream>

using namespace std;

int main() {
    
    int a = 9;
    int b = 0;
    int rs;
    
    // try 블록 내부에 예외가 있는지 감시
    try {
    
        if (b == 0) {
        
            // try에서 예외를 감시하면 throw에서 catch로 인자를 전달
            throw string("0으로는 나누기를 할 수 없습니다.");
        }
    
        rs = a/b;
        printf("결과 : %d\n", rs);
    
    // throw에서 던진 인자로 받아서 예외처리
	} catch (string error) {
	    cout << error << endl;
	}

    return 0;

}

 

결과

0으로는 나누기를 할 수 없습니다.

변수 b인 나눌 값이 0인 경우에는 throw로 catch로 던집니다.

catch에서는 호출될 경우 어떤 처리를 할 것인지 작성해둡니다.

throw 던진 문자열을 출력하고 있습니다.

변수 b에 0이 아닌 다른 값을 넣어서 실행을 해보겠습니다.

#include <iostream>

using namespace std;

int main() {
    
    int a = 9;
    int b = 2;
    int rs;
    
    // try 블록 내부에 예외가 있는지 감시
    try {
    
        if (b == 0) {
        
            // try에서 예외를 감시하면 throw에서 catch로 인자를 전달
            throw string("0으로는 나누기를 할 수 없습니다.");
        }
    
        rs = a/b;
        printf("결과 : %d\n", rs);
    
    // throw에서 던진 인자로 받아서 예외처리
	} catch (string error) {
	    cout << error << endl;
	}

    return 0;

}

 

결과

결과 : 4

 

변수 b에 나누기를 할 수 있는 0이 아닌 값을 지정했습니다.

0이 아닌 값이 들어왔기 때문에 throw로 들어가지 않고 나누기 계산을 했습니다.

그 결과값을 출력하였습니다.

catch문은 printf에 작성되어 있지만 실행되지 않습니다.

catch는 throw에서 호출한 경우에만 실행되기 때문입니다.

이것으로 예외 처리임 tyr catch 사용 방법을 마치겠습니다.

댓글