[C++ 기초부터 심화까지 Chapter 05. 예외 처리 구문]

2025. 5. 7. 23:59·개발 언어/C++

5장 소개

예외 처리하기

  • 프로그래밍에서 exception이란 문법적인 오류가 아닌 의도하지 않은 오류를 의미
  • 즉, 예외 처리란 프로그램 실행 흐름상 발생하는 오류에 대응하는 방법

05-1 예외 처리 구문

  1. try, catch, throw 문으로 예외 처리하기
  2. assert로 예외 처리하기
  • 소스 코드에 예외 처리를 해두면 예기치 못한 상황에도 유연하게 대처할 수 있음
  • 안정성을 높이고 비정상적으로 종요되지 않도록 함.
  • 유지 보수와 디버깅을 쉽게 만듦 --> 큰 규모의 프로젝트를 진행할 때, 함께 일하는 워커들이 코드의 안정성과 이해도를 높이는데 도움을 줌.

try, catch, throw 문으로 예외 처리

  • try: 예외가 발생할 수 있는 코드 블록을 중괄호 {}로 감싸 준다.
  • throw: 예외를 catch 블록으로 던진다.
  • catch: throw로 던진 예외를 받아서 처리한다.
  • throw가 던지는 예외 형식과 일치할 때만 예외를 처리하도록 함.
  • try_throw_catch_1.cpp 참고
try {
    // 예외를 던질 수 있는 코드      --> 1. 예외 발생 가능한 코드 블록
    throw 예외_값                 --> 2. 예외 발생
} catch (예외_형식 예외_이름) {     --> 3. 예외 형식 확인  
    // 예외를 처리하는 코드          --> 4. 예외 처리 블록
}

catch(...) 문으로 기타 예외 처리

  • 만약 어떤 데이터 형식의 예외를 throw로 던졌는데, 받아주는 catch 문이 없다면?
  • catch(...) 문으로 처리 되지 않은 나머지 예외 모두 받기가 가능함.
catch (...) // 처리되지 않은 나머지 예외 모두 받기
{
  cout << "catch all" << endl;
}

예외가 전달되는 순서

  • 만약 함수 내에서 예외를 던졌는데, 받아주는 catch가 없으면? --> 호출한 main 영역의 catch 문에서 정상적으로 처리된다.
  • 예외 처리의 책임은 throw가 발생한 함수를 호출한 쪽으로 넘어간다. --> 이 현상을 Stack unwinding, 스택 풀기라고 한다.

assertion, 어설션을 이용한 예외 처리

  • assertion은 코드를 검증하여 예상치 못한 상황에서 프로그램 동작을 중단시키는 도구, 안전성과 신뢰성을 높여줌.
  • C++에서는 헤더에 정의된 assert 매크로를 통하여 예외를 비교적 간단하게 처리할 수 있다.
  • assert는 디버그 모드에서 오류가 생길수 있는 부분을 검사할 수 있는 매크로이다.

문법 요약

  • 예외가 발생할 수 있는 코드를 try 블록으로 감싼다.
  • 예외가 발생하면 프로그램의 제어는 즉시 try 블록 다음에 오는 catch 블록으로 넘어간다.
  • throw 키워드로 예외를 던진다. throw 다음에 지정하는 예외 형식은 모든 유형이 될 수 있다. 
  • catch 블록에는 throw로 던진 예외 형식으로 매개변수를 선언한다. 이 매개변수로 오류 메시지 같은 예외 정보에 접근한다.
  • 단일 try 블록에 catch 블록이 여러 개 있을 수 있으며, 각 블록은 서로 다른 유형의 예외를 처리하도록 정의한다.
try {
 // 예외가 발생할 수 있는 코드 영역
 	throw exception_value; // 예외를 강제로 발생시키는 코드
} catch (exception_type e) {
	// 예외가 발생했을 때 실행되는 코드 블록
    // e에는 발생한 예외의 정보가 담겨 있음
    // exception_type은 실제 예외 형식에 따라 정의
 }

05-2 예외 처리 생략과 실패 대응

  • 예외 처리 메커니즘도 때로는 예외를 처리하지 못할 수 있음.
  • noexcept와 set_terminate를 활용해 예외 처리와 예외 처리 실패에 대응하고 프로그램의 안정성과 신뢰성을 높이는 방법을 알아봄

예외 처리 생략 - noexcept

  • 함수에서 문제가 발생할 때, 반드시 예외를 발생시켜야하는 것음 아님.
  • 당연히 오류와 예외는 다름.
  • 값이나 실행 흐름을 충분히 예측할 수 있을 때는 if문으로 처리하는 것이 성능 면에서 훨씬 이득.
  • 함수가 예외를 던지지 않음을 나타낼 때는 다음처럼, noexcept 키워드로 명시할 수 있음.
  • noexcept를 사용하여 함수가 예외를 던지지 않음을 명시하면 컴파일러가 코드를 최적화하고 빠르게 실행하는데 도움이 됨.
  • int func() noexcept // 함수가 예외를 던지지 않음을 명시

 

※ 이 글은 직접 구매한『Do it! C++ 완전 정복』(문종채, 조규남 저, 성안당)을 참고하여 개인적으로 학습한 내용을 정리한 것입니다. 본문에 사용된 내용 및 예제 코드는 책의 내용을 기반으로 하되, 이해를 돕기 위한 개인적인 해석과 실습 결과를 포함하고 있습니다.

 

참고한 예제 코드: [GitHub - mystous/DoItCPP](https://github.com/mystous/DoItCPP) 
예제 코드의 일부는 위 오픈소스 저장소를 참고하거나 수정하여 활용했으며, 해당 저장소는 학습용으로 공개되어 있습니다.

 

 

'개발 언어 > C++' 카테고리의 다른 글

[C++ 기초부터 심화까지 Chapter 06. 객체지향과 클래스]  (0) 2025.05.08
[C++ 기초부터 심화까지 Chapter 04. 실행 흐름 제어]  (0) 2025.05.07
[C++ 기초부터 심화까지 Chapter 03. Pointer and memory]  (2) 2025.05.07
C++ 공부에 관하여  (0) 2025.05.07
'개발 언어/C++' 카테고리의 다른 글
  • [C++ 기초부터 심화까지 Chapter 06. 객체지향과 클래스]
  • [C++ 기초부터 심화까지 Chapter 04. 실행 흐름 제어]
  • [C++ 기초부터 심화까지 Chapter 03. Pointer and memory]
  • C++ 공부에 관하여
lidarmansiwon
lidarmansiwon
lidarmansiwon 님의 블로그 입니다.
  • lidarmansiwon
    라이다맨 시원의 연구개발 라이프
    lidarmansiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (12)
      • 이론 정리 (2)
        • Thor I. Fossen 리뷰 (1)
      • Ubuntu 및 Linux (0)
        • Trouble shooting (0)
      • 개발 언어 (5)
        • C++ (5)
        • Python (0)
      • 논문 리뷰 (3)
      • ROS2 (2)
  • 블로그 메뉴

    • Github
    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    marinecraft
    자율선박
    maritimerobotics
    슬라이딩 모드 컨트롤
    c++ 기초부터 심화까지
    navigationcontrol
    fossen
    usv formation
    cpp
    singlethreadedexecutor
    이접안
    ROS2
    실행 흐름 제어
    C++
    Sliding mode control
    multithreadedexecutor
    motioncontrol
    usv formation path planning based on behavior trees and fast marching method
    해양공학
    do it! c++ 완전 정복
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
lidarmansiwon
[C++ 기초부터 심화까지 Chapter 05. 예외 처리 구문]
상단으로

티스토리툴바