예외 던지기 : throw
template <typename T>
class vector{
public :
vector(size_t size) : size(size) {
data_ = new T[size];
for(int i = 0; i <size; ++i){
data_[i] =3;
}
}
const T& at(size_t index) const{
if(index >= size_){
throw std::out_of_range("vector의 크기를 초과했습니다");
}
return data_[index];
}
}원래라면, at() 함수의 반환 타입이 T&이기에 오류 메시지를 출력할 수는 없지만
이 throw를 사용하게 되면 가능해진다.(std::out_of_range 는 객체다)
위와 같이 예외를 throw하게 되면 예외 처리하는 부분까지 점프 하게 되어 아래 코드들은 실행되지 않는다.
중요한 점은, 예외 처리를 실제로 진행하게 되는 곳까지(catch) 함수를 빠져나가면서, 해당 stack 메모리에 생성되었던 객체들을 모두 소멸시켜주는 것이다.
예외 받기 : tyr&catch
try{
data = vec.at(29);
}
catch(std::out_of_range &e){
std::cout<<"예외 발생함"<<e.what()<<std::endl;
}try부분은에 예외가 발생할 만한 코드가 실행이 되고, 만약 예외가 발생되지 않았다면 try/catch가 없는 것처럼 작동하게 된다.
예외가 발생햇다면, Stack에 생성된 객체의 소멸자들이 모두 호출이 되고, 가장 가까운 catch문으로 점프하게 된다. ⇒스택 풀기 (stack unWinding)
- [!] 생성자에서 예외가 발생하게 되면 소멸자가 호출되지 않는다!!