← back to posts

[문제해결및실습:C++] 4주차 C++에서의 예외처리

세종대학교 2026-1 문제해결및실습:C++ 강의 정리노트

C++

예외처리하기

try, catch, throw

예외가 발생했을 때 프로그램의 제어 흐름을 변경하고 예외를 처리한다.

  • try : 예외가 발생할 수 있는 코드 블럭을 중괄호로 감싼다
  • throw : 예외를 catch 블록으로 던진다
  • catch : throw 로 던진 예외를 받아서 처리한다
try {
  // 예외 상황 발생
  throw exception_value;
} catch (exception_type e) {
  // 예외 처리
}

stack unwinding

catch 되지 못한 예외는 상위로 던져지고, 상위 호출부에서 catch 처리 가능하다

어설션을 이용한 예외처리

assertion

코드를 검증하여 예상치 못한 상황에서 프로그램 동작을 중단한다

예상치 못한 상황, 결과로 인한 심각한 오동작 대신 프로그램을 중단.
<cassert> 에 정의된 assert 매크로를 통해 사용하며, assert 는 디버그모드에서 사용할 수 있는 매크로 함수다.

디버그 모드와 릴리즈 모드

  • 디버그 모드
    • 컴파일 할 때 디버깅을 위한 정보들을 삽입, 문제 원인을 찾을 수 있다.
  • 릴리즈 모드
    • 사용자에게 배포되는 코드를 만들 때 사용한다. 디버깅 정보, 심벌, 주석 등이 제거되고 최적화 된다.

assert 를 사용할 때 주의할 점

디버그 모드에서만 동작하므로 프로그램에 영향을 미치는 코드는 사용하지 말아야 한다.

릴리즈 모드로 컴파일할 경우 해당 코드는 동작하지 않는다.

#include <cassert>
using namespace std;

void print_number(int *_pt_int)
{
  assert(_pt_int != NULL);
  cout << *_pt_int << endl;
}

int main()
{
  int a = 100;
  int *b = NULL;
  int *c = NULL;
  b = &a;
  print_number(b);
  // c는 NULL인 상태로 인자 전달
  print_number(c);
  return 0;
}

예외 처리 생략과 실패 대응

예외 처리 생략 - noexcept

함수가 예외 처리를 하지 않는다고 명시적으로 컴파일러에게 알릴 수 있다.

int func() noexcept

특정 함수가 예외처리를 하는지 아닌지도 확인할 수 있다.

bool does_not_throw = noexcept(my_function());

그리고 예외 처리 없음을 명시했는데 예외를 발생시킬 경우 컴파일 에러 발생

warning C4297: 'fake_noexcept': 함수는 예외를 Throw하지 않도록 지정되었으나 예외를
Throw했습니다.
message : 함수에서 __declspec(nothrow), throw(), noexcept(true) 또는 noexcept를 지정했습
니다.

예외 처리 실패 대응 - set_terminate

항상 예외가 잘 처리되는 건 아니다
catch 문이 없거나, 있더라도 형식이 맞지 않으면 프로그램은 정상적으로 실행되지 않고 강제 종료된다.

그리고 이럴 경우 특정 함수를 호출해서 마지막으로 이거 한번 해봐라 라는 기능

set_terminate(종료_처리_함수);

예시

void handle_terminate() {
  cout << "myterminate called" << endl;
  exit(-1);
}

int main(void) {
  set_terminate(handle_terminate);

  // 예외 발생하고 catch 는 없어서, set_terminate 호출됨
  throw 1;

  // 그리고 아래 return 은 실행되지 않음
  return 0;
}