[c++] 예외처리 본문

객체지향프로그래밍 (C++)

[c++] 예외처리

미니모아 2020. 7. 13. 14:25
반응형
  1. 구조적 예외 처리

    // 원소의 값을 바꾼다
    void DynamicArray::SetAt(int index, int value)
    {
     // 인덱스의 범위가 맞지 않으면 예외를 던진다
     if (index < 0 || index >= GetSize())
         throw "Out of Range!!!";
    
     arr[index] = value;
    }
    // 크기가 10인 배열 객체를 만든다.
    DynamicArray arr(10);
    
    try
    {
      arr.SetAt(5, 100);
      arr.SetAt(8, 100);
      arr.SetAt(10, 100);
    }
    catch(const char* ex)
    {
      cout << "예외 종류 : " << ex << "\n";
    }
  1. 예외를 객체를 던져주는 경우 (레퍼런스로 던져 주는 것이 좋음)
try
{
MyException e( this, “객체”, 0 );
throw e;
}
catch( MyException& ex)
{
cout << ex.description << “\n”;
}
  1. 동적메모리 할당하는 경우
    - 생성자에서 오류 발생하면 객체 생성되지 않은 것으로 간주하고 소멸자 실행되지 않음, 내부에서 리소스 처리 해줘야함
    - 이외에는 소멸자에서 리소스 처리 가능
    - 스마터 포인터 사용하는 경우 따로 메모리를 해제해줄 필요가 없다.

#include <memory>
using namespace std;

int main()
{
    // 스마트 포인터 생성
    auto_ptr<int> p( new int );

    // 스마트 포인터의 사용
    *p = 100;

    // 메모리를 따로 해제해 줄 필요가 없다

    return 0;
}
  • auto_ptr 대체 unique_atr (c++11)
    객체에 유일한 소유권 부여, 생성자는 하나인데 소멸자가 여러개 실행되는 경우를 막아줌

    #include <iostream>
    #include <memory>
    using namespace std;
    class Test {
      int* data;
    public:
      Test() {
          cout << "생성자!" << endl;
          data = new int[100];
      }
      ~Test() {
          cout << "소멸자!" << endl;
          delete[] data;
      }
      void t() { cout << "테스트 중..." << endl; }
    };
    void testing(){
      //Test* t1 = new Test();
      //Test* t2 = t1;
      unique_ptr<Test> up1(new Test()); // C++11 (기존의 auto_ptr을 보완 대체)
      // Test* up1 = new Test();
    
      //unique_ptr<Test> up2 = up1;
      //up1->t();
    }
    void main() { 
      testing(); 
    }
    
  1. 예외 랠리

#include <iostream>
using namespace std;
void C() {
    //throw 123;
    //throw "Hell";
    throw 2.71f;
}
void B() {
    C();
}
void A() {
    try {
        B();
    }
    catch (int ex) {
        cout << "예외(A함수/정수처리) = " << ex << "\n";
        throw; // 예외 다시 던지기
    }
}
int main() {
    try {
        A();
    }catch (int ex) {
        cout << "예외(Main함수/정수처리) = " << ex << "\n";
    }catch (const char* ex) {
        cout << "예외(Main함수/문자열처리) = " << ex << "\n";
    }catch (...) { //catch 맨 마지막에 와야함
        cout << "기타 예외\n";
    }
    return 0;
}

반응형
Comments