🧑🏻‍💻 Programming/C, C++

[C++] C++ 예외 처리 (try~catch, throw 구문)

koko1177 2025. 4. 5. 16:55
반응형

C++ 예외 처리 (Exception Handling)

 

1. try~catch, throw 구문의 기본 형식

// try~catch, throw의 기본 형식

try {	// [예외 발생 영역]
    if (예외 조건) 
    	throw 예외 객체;	// [예외가 발생하면 예외를 던지는 영역]
} 
catch (예외 객체) {	// [던져진 예외를 잡는 영역]
	// [예외 처리 영역]
}
  • 예외 발생 시 throw로 예외를 던지고, try 블록에서 시도하며, catch로 처리함
    • try : 예외가 발생할 수 있는 코드를 감쌈
    • throw : 예외 발생 시 알려주는 역할 (변수를 넣어 보낼 수도 있음. ex: throw(expn))
    • catch : 발생한 예외를 받아 처리함 (throw에서 던진 예외 객체를 받음)

2. C++의 예외 처리 사용이 선호되는 이유

  • 코드 흐름 깔끔하게 유지
  • 예외는 코드를 호출 → 오류 조건 인식/처리하도록 강제
  • 처리되지 않은 예외 → 프로그램 실행 중지
  • 예외는 호출 스택에서 오류를 처리할 수 있는 지점으로 이동
  • 오류를 감지하는 코드, 오류를 처리하는 코드 사이를 완전히 분리 가능
  • 오류 상황 명확하게 구분 가능
  • 에러 복구 구조화된 방식으로 처리
  • 코드 재사용성 & 유지보수성 ↑

3. C++ 예외 및 오류 처리 모범 사례

// C++ 예외 및 오류 처리 모범 사례 
// https://learn.microsoft.com/ko-kr/cpp/cpp/errors-and-exception-handling-modern-cpp?view=msvc-170

#include <stdexcept>
#include <limits>
#include <iostream>

using namespace std;

void MyFunc(int c) {
    if (c > numeric_limits< char> ::max()) {
    	// 예외 객체 -> invalid_argument("")
        throw invalid_argument("MyFunc argument too large.");	// [예외가 발생하면 예외를 던지는 영역]
    }
    //...
}

int main()
{
    try {	// [예외 발생 영역]
        MyFunc(256); //cause an exception to throw
    }
    // 예외 객체 -> invalid_argument("")
    catch (const exception& e) {	// [던져진 예외를 잡는 영역]
        // [예외 처리 영역]
        cerr << e.what() << endl;
        return -1;
    }
    //...
    return 0;
}
  • throw invalid_argument : 표준 라이브러리에서 제공하는 예외 클래스 중 하나
    • std::invalid_argument 은 예외로 던질 객체 타입 정의 
    • 잘못된 인자를 받았을 때 사용됨
    • 오류가 생겼다는 것을 명시
    • throw에서 던진 예외 객체를 참조(&)로 받아야 함
  • catch(const exception& e) vs catch(invalid_argument& e)
    • exception은 모든 표준 예외 클래스의 기본 클래스 (부모 클래스)
    • invalid_argument exception을 상속받은 자식 클래스 중 하나
    • const exception& e로 받으면 다양한 예외 타입을 하나의 블록에서 포괄적으로 처리 가능
    • But, invalid_argument& e로 받으면 특정 예외 타입만 잡음
  • cerr : 에러 출력을 위한 스트림 (표준 오류 출력)
    • 에러가 발생하여 데이터를 콘솔 화면에 출력할 때 사용
    • ex) cerr << "에러 발생" << endl;
    • std::cout와 같은 동작, But 버퍼의 유무가 차이점
      • cout : 버퍼를 가지고 있어 버퍼에 데이터가 쌓이면 출력
      • cerr : 버퍼가 없어 에러 메시지 즉시 출력
  • e.what() : 예외 객체(= invalid_argument(""))가 가지고 있는 오류 메시지를 문자열로 반환하는 멤버 함수

4. C++ 과 C의 예외 처리 비교

C++ 예외 처리 C 예외 처리 기능이 없어 아래와 같이 직접 조건 분기로 처리
// C++ 예외 처리 코드
// try~catch, throw 구문

#include <iostream>
 
using namespace std;
 
int divideFunc(int a, int b) {
if (b == 0) 
     throw invalid_argument("0으로 나눌 수 없음");
    return a / b;
}
 
int main()
{
    try {
     int result = divideFunc(10, 0);
        cout << "결과 : " << result << endl;
    } 
    catch (const exception& e) {
        cerr << "예외 발생: " << e.what() << endl;
        return -1;
}
    return 0;
}
// C 예외 처리 코드
// 예외 처리 기능이 없어 아래와 같이 직접 조건 분기로 처리

#include <stdio.h>

int divideFunc(int a, int b) {
    if (b == 0) {
        return -1;    // 오류 코드 반환
    }
    return a / b;
}

int main() {
    int result = divideFunc(10, 0);

    if (result == -1) {    // 직접 예외 처리
        printf("에러 : 0으로 나눌 수 없음.\n");
    } else {
        printf("결과 : %d\n", result);
    }
    return 0;
}

 

 

 

반응형

'🧑🏻‍💻 Programming > C, C++' 카테고리의 다른 글

[C, C++] C 와 C++ 비교  (0) 2025.04.05
[C/C++] C/C++ 언어 error 처리  (0) 2022.02.15