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 문 이후에서는 재개되지 않음 : 던졌으면 끝