산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C++ 예외 처리 마스터: try, catch, throw 실전 예제

C++ 예외 처리란?

예외 처리는 C++ 프로그램이 예기치 않은 런타임 오류로부터 우아하게 복구할 수 있게 합니다. 오류 발생 시 제어가 특별한 핸들러로 점프하여 어떻게 대응할지 결정합니다.

잠재적으로 문제가 될 수 있는 코드를 try 블록으로 감싸고 그 뒤에 하나 이상의 catch 절을 두면, 프로그램에 예외적 상황을 관리할 명확한 경로를 제공합니다.

예외가 던져지지 않으면 try 블록이 정상 실행되고 핸들러들은 우회됩니다.

이 튜토리얼에서 배울 내용:

왜 예외 처리인가?

예외 처리는 여러 실질적 이점을 제공합니다:

핵심 예외 처리 키워드

세 키워드가 C++ 예외 처리의 중추를 이룹니다:

try 블록 안의 코드를 보호된 코드라 하며, 예외를 던지면 해당 catch 블록이 실행됩니다.

문법

 try {
    // 보호된 코드
} catch (Exception_Name exception1) {
    // exception1 처리
} catch (Exception_Name exception2) {
    // exception2 처리
} // ... 더 많은 catch 블록 

예제 1: 벡터 요소 범위 밖 접근

#include<iostream>
#include<vector>
using namespace std;
int main() {
    vector<int> vec;
    vec.push_back(0);
    vec.push_back(1);
    try {
        vec.at(2); // 범위 밖
    } catch (exception& ex) {
        cout << "Exception occurred!" << endl;
    }
    return 0;
} 

출력:

C++ 예외 처리 마스터: try, catch, throw 실전 예제

코드 스크린샷:

C++ 예외 처리 마스터: try, catch, throw 실전 예제

코드 분석:

  1. I/O와 컨테이너 지원을 위해 iostream과 vector 포함
  2. 완전 자격 이름 방지를 위해 std 네임스페이스 사용
  3. vector<int> 인스턴스화 및 채우기
  4. try 블록 내부에서 벡터 범위 밖 요소 접근 시도
  5. 표준 std::exception을 잡고 메시지 출력
  6. main에서 반환

예제 2: 0으로 나누기 처리

#include <iostream>
using namespace std;
double zeroDivision(int x, int y) {
    if (y == 0) {
        throw "Division by Zero!";
    }
    return static_cast(x) / y;
}
int main() {
    int a = 11;
    int b = 0;
    double c = 0;
    try {
        c = zeroDivision(a, b);
        cout << c << endl;
    } catch (const char* message) {
        cerr << message << endl;
    }
    return 0;
} 

출력:

C++ 예외 처리 마스터: try, catch, throw 실전 예제

코드 스크린샷:

C++ 예외 처리 마스터: try, catch, throw 실전 예제

코드 분석:

  1. 0으로 나누면 C-문자열을 던지는 zeroDivision 정의
  2. 함수를 try 블록 내부에서 호출하고 결과 출력
  3. 문자열 예외를 잡고 에러 메시지 출력

C++ 표준 예외

C++ 예외 처리 마스터: try, catch, throw 실전 예제

표준 라이브러리는 <exception>에 풍부한 예외 계층을 선언합니다. 가장 자주 사용되는 것들:

예외설명
std::exception모든 표준 예외의 기본 클래스
std::bad_allocnew 할당 실패 시 던져짐
std::bad_castdynamic_cast 실패 시 던져짐
std::bad_exception예기치 않은 예외 알림용
std::bad_typeid널인 다형 타입의 glvalue에 typeid 적용 시
std::logic_error프로그래머가 감지해야 할 오류
std::domain_error수학 함수의 유효하지 않은 도메인
std::invalid_argument함수가 유효하지 않은 인수 수신
std::length_error너무 큰 문자열 생성 시도
std::out_of_rangevector::at에서 인덱스 범위 초과 시
std::runtime_error다른 카테고리로 잡히지 않는 런타임 오류
std::overflow_error수학적 오버플로 발생
std::range_error연산에 대한 값이 범위 밖
std::underflow_error수학적 언더플로 발생

사용자 정의 예외

std::exception 기본 클래스를 확장하여 도메인별 에러 타입을 만들 수 있습니다. what()을 오버라이드하면 설명 메시지를 제공합니다.

예제: 사용자 정의 예외

#include <iostream>
#include <exception>
using namespace std;
class NewException : public exception {
public:
    const char* what() const noexcept override {
        return "newException occurred";
    }
} newex;
int main() {
    try {
        throw newex;
    } catch (exception& ex) {
        cout << ex.what() << '\n';
    }
    return 0;
} 

출력:

C++ 예외 처리 마스터: try, catch, throw 실전 예제

코드 스크린샷:

C++ 예외 처리 마스터: try, catch, throw 실전 예제

코드 분석:

  1. NewException을 std::exception에서 파생하고 what() 오버라이드
  2. 던질 객체 newex 인스턴스화
  3. try 블록 내부에서 newex 던지기
  4. std::exception 참조로 잡고 what()으로 메시지 출력

핵심 정리

C 언어

  1. C++ 주석: 가독성 높고 유지보수하기 좋은 코드 작성법
  2. Python 예외 처리 마스터하기: try, except, else, finally 완전 정복
  3. Java 예외 처리 마스터: try-catch-finally, throw, throws 완전 정복
  4. Java 예외 처리 심화: try-catch-finally와 리소스 관리
  5. C++ switch-case 마스터하기: 문법, 활용법, 실전 예제
  6. C++ 동적 배열 할당 완벽 가이드: new, delete, 실전 코드 예제
  7. C++ 구조체(struct) 완벽 가이드: 선언, 인스턴스, 포인터, 함수 인자 전달
  8. C++ std::list 마스터하기: 문법, 함수, 실전 예제
  9. C++ 구조체 vs 클래스: 핵심 차이, 문법, 최적 사용 사례
  10. 2021년 윈도우·맥·리눅스용 베스트 C++ IDE 15선 – 무료·유료 옵션