5장 소개
예외 처리하기
- 프로그래밍에서 exception이란 문법적인 오류가 아닌 의도하지 않은 오류를 의미
- 즉, 예외 처리란 프로그램 실행 흐름상 발생하는 오류에 대응하는 방법
05-1 예외 처리 구문
- try, catch, throw 문으로 예외 처리하기
- 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 |