함수가 실패하면 throw 키워드를 사용해서 예외를 던진다
던져진 예외를 처리하지 않으면 프로그램은 종료된다.
예외의 가능성이 있는 코드는 try block으로 묶어두고, catch 블록을 이용해서 예외를 처리해주면 된다.
catch문은 여러개를 만들 수 있다.
예외처리 후 try block 밖 코드가 계속해서 실행된다. 따라서 종료가 필요할경우 catch문에서 종료해주면됨.
catch(...) 은 맨마지막에만 둘 수 있다.
예외 전용 클래스를 만들어서 사용한다.
std::exception으로부터 상속받은 클래스들을 사용하거나 상속 받아 만드는 것이 좋다.
exception을 catch할때 가상함수 what을 사용하라면 값이 아닌 참조 타입으로 받아야한다.
#include <iostream>
class FileNotFound : public std::exception
{
public:
// what함수를 재정의해서 사용
virtual const char* what() const noexcept
{
return "File Not Found";
}
};
void foo()
{
throw FileNotFound();
}
int main()
{
try
{
foo();
}
catch(FileNotFound e)
{
std::cout << e.what() << std::endl;
}
catch(std::exception& e)
{
std::cout << e.what() << std::endl;
}
catch(...)
{
}
}
noexcept
함수가 예외가 있다, 없다를 표기하는 방법이다.
예외가 없는 함수같은 경우는 컴파일러 최적화가 더욱 잘된다.
except와 throw를 같이쓰면 컴파일에서 에러가 발생한다.
//void foo() throw() //예외 없음
//void foo() //예외 있음
//void foo() throw(int) //예외 있음
//void foo() // 예외가 있다.
//void foo() noexcept(false) // 예외 가 있다.
//void foo() noexcept(true ) // 예외가 없다.
void foo() //noexcept // 예외가 없다.
{
throw 1;
}
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 추상클래스, 인터페이스 (0) | 2021.08.21 |
---|---|
[C++] 가상함수 (0) | 2021.08.21 |
[C++] 상속 (0) | 2021.08.21 |
[C++] this 포인터 개념 (0) | 2021.08.20 |
[C++] 상수 멤버 함수 const member function (0) | 2021.08.20 |