카테고리 없음

[C++] Exception Handling

곽가누 2024. 6. 20. 01:07

1. 기본 구조 

#include <iostream>
#include <vector>

int main() {
    std::vector<double> nums{ 1.0, 2.0, 3.0 };
    int input;
    while (true) {
        std::cout << "Enter an index: ";
        std::cin >> input;
        try {
            std::cout << nums.at(input) << '\n';
            break; // Printed successfully, so break out of loop
        }
        catch (std::exception& e) {
            std::cout << e.what() << std::endl;
            std::cout << "Index is out of range. Please try again.\n";
        }
    }
}

 

2. exception inheritance

 

load_vector 함수 (안중요)

std::vector<int> load_vector(const std::string& filename) {
    std::ifstream fin(filename); // Open the text file for reading
    if (fin.good()) { // Did the file open successfully?
        std::vector<int> result; // Initially empty vector
        int n;
        fin >> n; // Size of data set
        for (int i = 0; i < n; i++) {
            int value;
            fin >> value; // Read in a data value
            result.push_back(value); // Append it to the vector
        }
        return result; // Return the populated vector
    } else { // Could not open the text file
        throw FileNotFoundException(filename);
    }
}
class FileNotFoundException : public std::exception {
    std::string message; // Identifies the exception and filename
public:
    // Constructor establishes the exception object's message
    FileNotFoundException(const std::string& fname)
        : message("File \"" + fname + "\" not found") {}

    // Reveal message to clients
    virtual const char* what() const throw () {
        return message.c_str();
    }
};
int main() {
    try {
        std::vector<int> numbers = load_vector("values.data");
        for (int value : numbers)
            std::cout << value << ' ';
        std::cout << '\n';
    } catch (std::exception& e) {
        std::cout << e.what() << '\n';
    }
}

 

 

3. try-catch 2번씩 써서 오류뜨면 catch 2번 하게 하는것도 가능

void filter(std::vector<int>& v, int i) {
    v.at(i)++;
}

 

 

void compute(std::vector<int>& a) {
    for (int i = 0; i < 6; i++) {
        try {
            filter(a, i);
        }
        catch (std::exception& ex) { //first catcher
            std::cout << "********************************\n";
            std::cout << "* For loop terminated prematurely\n";
            std::cout << "* when i = " << i << '\n';
            std::cout << "********************************\n";
            throw ex; // Rethrow the same exception
        }
    }
}

여기서 한번 더 던져서 

int main() {
    std::vector<int> list { 10, 20, 30, 40, 50 };
    try {
        compute(list);
    }
    catch (std::exception& e) { //second catcher
        std::cout << "Caught an exception: " << e.what() << '\n'; 
    }
    std::cout << "Program finished\n";
}

OX 나올만한거

- 한줄만 나와도 curly brace로 감싸야함

- 표준 라이브러리의 구성요소에 의해 던져진 모든 객체는 이 클래스에서 파생됨

- 첫번째 catch 문이 나타날 때 까지 오류가 상위 함수로 이동 

-inheritance 가능: own constructor, override가능

- 예외는 try 블록 내에서 throw 키워드를 사용 or  명시적인 예외 던지기 연산을 통해 throw

- throw 표현식은 하나의 매개변수를 받아서 예외 처리기에게 인수로 전달

- 여러 개의 처리기(즉, catch 표현식)가 체인으로 연결될 수 있으며, 각 처리기는 다른 매개변수 유형을 가짐

- 예외가 처리된 후 throw 문 이후에서는 재개되지 않음 : 던졌으면 끝