반응형
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 |