본문 바로가기
C++/C++ 문법

C++ 예외 처리 (try-catch)

by Sein_ 2025. 10. 13.
728x90

[Do it C++ 완전정복_ 176~193p]

예외(exception) 처리

프로그램 실행 중 예상치 못한 오류(예외) 가 발생했을 때, 비정상 종료 대신 정상적으로 대처할 수 있도록 하는 구조

 

try / catch / throw 문

  • try : 예외가 발생할 가능성이 있는 코드를 감싸는 블록
  • throw : 예외가 발생했음을 알릴 때 사용 (예외 객체 또는 값 전달)
  • catch : 예외를 받아 처리하는 블록
try {
    // 예외가 발생할 가능성이 있는 코드
    if (조건)
        throw "오류 발생";  // 예외 던지기 (문자열 객체 전달)
}
catch (const char* e) {      // 예외를 받아 처리
    cout << "예외 처리: " << e << endl;
}

 

예외를 던질 때(throw)

throw 뒤에는 예외 상황을 설명하는 값이나 객체를 전달합니다.

throw -1;              // 정수 예외
throw "파일을 찾을 수 없음"; // 문자열 예외
throw runtime_error("잘못된 입력"); // 표준 예외 객체

 

여러 종류의 예외를 처리(catch)

  • 하나의 try 블록 뒤에는 여러 개의 catch 문을 둘 수 있습니다.
  • 가장 먼저 해당 타입과 일치하는 예외 처리기가 실행됩니다.
  • catch(...)는 모든 타입의 예외를 포괄적으로 처리한다.
try {
    throw 3.14;
}
catch (int e) {
    cout << "정수 예외 발생: " << e << endl;
}
catch (double e) {
    cout << "실수 예외 발생: " << e << endl;
}
catch (...) {
    cout << "기타 예외 발생\n";
}

 

예외 처리 생략 (noexcept)

함수 선언 시 noexcept를 붙이면 이 함수 안에서는 예외가 발생하지 않음을 명시합니다.

만약 예외가 발생하면 → 프로그램 강제 종료(terminate 호출)

void safeFunc() noexcept {
    cout << "예외 없는 함수" << endl;
}

 

예외 처리 실패 대응 (set_terminate)
예외가 끝까지 처리되지 않아 std::terminate()가 호출될 때, 실행할 함수를 사용자가 직접 지정할 수 있습니다.

#include <iostream>
#include <exception>
using namespace std;

void myTerminate() {
    cout << "예외가 처리되지 않아 프로그램을 종료합니다.\n";
    exit(1);
}

int main() {
    set_terminate(myTerminate);  // 종료 함수 등록
    throw 1;                     // 처리되지 않은 예외 → myTerminate 호출
}

 

어설션을 이용한 예외 검사 (assert)

  • 어설션(assert) 은 디버그 모드에서만 실행되는 오류 검사 매크로입니다.
  • 프로그램 실행 중 논리적으로 절대 일어나면 안 되는 상황을 검사할 때 사용합니다.
#include <cassert>
#include <iostream>
using namespace std;

int divide(int a, int b) {
    assert(b != 0);  // b가 0이면 프로그램 중단 (디버그 모드)
    return a / b;
}

int main() {
    cout << divide(10, 2) << endl;
    cout << divide(5, 0) << endl;  // assert 실패 → 프로그램 중단
}

 

 

함수에서의 예외처리

throw를 해주는 부분과 catch를 해주는 부분이 달라도 상관없다!

예제를 보면 함수 내부에서 throw를 하고 있는데, 함수 내에는 예외를 처리하는 영역이 없다.

이럴 경우, 해당 함수는 호출된 영역으로 예외를 전달한다. (예제의 경우에는 main)

main -> try -> pop함수에서 예외가 발생하였으므로 catch영역에서 예외를 처리하게 된다.

이와 같은 형식을 Stack풀기라고 한다.

#include <iostream>
#include <vector>

using namespace std;

void pop(vector<int> &v) {
    if (v.size() <= 0) { //예외 발생
        throw string("Underflow!");
    }
    v.pop_back();
}

void main() {
    vector <int> v{ 1,2,3 };
    try
    {
        while (true) {
            pop(v);
        }
    }
    catch (string error)
    {
        cout << error << endl;
    }
}

 

 

https://coding-factory.tistory.com/706#google_vignette

 

[C++] 예외 처리 (Exception Handling) try, catch ,throw

예외란? 예외란 문법적인 오류가 아닌 프로그램이 의도하지 않은 오류를 말합니다. 즉 개발자가 예상하는 동작을 제외한 나머지 전체라고 할 수 있습니다. 대부분의 경우 예외가 발생하면 시도

coding-factory.tistory.com