[C++] 예외 처리

강민석·2022년 10월 19일
0

이것이 C++이다

목록 보기
8/8
post-thumbnail

Chapter.10 예외 처리

10.1 try, throw, catch

  • C++은 '구조화된 예외 처리'를 지원한다.

10.1.1 기본 활용 방법

try {
    ...
    if(에러 발생)
        throw errcode1;
    ...
    if(에러 발생)
        throw errcode2;
    ...
    if(에러 발생)
        throw errcode3;
}

catch(int errcode) {
    ...
}
  • try-catch 문은 기본적으로 if문과 큰 차이가 없어보이지만, 예외 처리를 한 곳에 묶을 수 있어 구조적으로 간결한 코드를 만들 수 있다는 장점이 있다.

10.1.2 catch 다중화

  • try-catch 문에서 catch문은 여러 개로 구현할 수 있는데, 이를 'catch 다중화'라고 한다.
  • 가령 throw문으로 예외를 던질 때 값의 자료형이 int인 경우와 char인 경우를 각각 다른 catch문으로 처리할 수 있다.

  • 적절한 catch문이 없는 경우를 대비하여 다음과 같이 어떤 형식이든 받아들이는 catch문 블록을 만들 수 있다.

    try {}
    catch(...) {
    
        ~~~
    
    }

10.1.3 예외 클래스

  • catch문 블록은 값의 형식에 따라 다중화가 가능한데, 이 형식에는 사용자 정의 클래스도 포함된다.
  • 따라서 CMyException따위의 클래스를 정의하여, 예외가 발생한 경우에 대해 여러 가지 정보를 포함할 수 있다.
    • 오류 원인 등을 파악할 때 유용할 것으로 보인다.

10.2 스택 풀기(Stack unwinding)

  • 함수 호출 스택 최상단의 함수에서 예외가 발생한 경우, 일반적으로는 호출 스택이 순차적으로 반환하게끔 코드를 작성해야 하지만, 구조화된 예외 처리를 이용하면 스택이 즉시 풀려서 catch문으로 흐름이 넘어가게 된다.

10.3 메모리 예외 처리

  • 배열 등의 메모리를 할당할 때, 잘못된 값이 전달될 경우 다음과 같이 예외 처리를 활용할 수 있다.

    int main(int argc, char* argv[]) {
        char *data;
    
        int size;
        cout << "Input Size: ";
        cin << size;
    
        try {
            data = new char[size];
        }
    
        catch(bad_alloc &e) {
            cout << e.what() << endl;
        }
    }

0개의 댓글