: 예상치 못한 오류를 잡아내는 수단.
1) try ~ catch를 작성하고, try 문안에서 실행할 함수를 작성하자.
2) 함수가 어떤 타입을 반환하든 관계없이 함수 실행이 잘못된 결과를
가지고 온다면 throw 원형타입 을 작성하자.
3) catch문에서는 trhow 던지는 타입을 인자로 받는 구문을 작성하자.
try
{
// 실행할 함수를 작성함.
int ret = readFile();
}
catch( primitive type 변수명 )
{
}
1) catch문을 여러개 만들 수 있음.
2) catch(...) 을 이용해 모든 종류의 예외를 잡을 수 있음.
-> 가변인자가 있는 catch 문은 반드시 마지막에 놓여야 함.
: File을 read하는 함수를 만들자.
이전에는 원형 타입을 throw 해서 catch문으로 받았음.
-> 클래스를 throw 할 수 있음.
c++에서는 예외 전용 클래스가 있음.
: 이를 상속한 후, 가상함수인 what을 이용해 예외처리할 수 있음.
: virtual const char* what() const noexcept
class MemoryException : public std::exception
{
public:
virtual const char* what() const noexcept
{
return "error";
}
};
int foo()
{
if (1)
throw MemoryException();
return 0;
}
int main()
{
try
{
foo();
}
catch (MemoryException& e)
{
std::cout << e.what() << std::endl;
}
}
: catch 문을 항상 참조 타입으로 인자를 사용해야 함.
-> 그렇지 않으면, 복사가 발생해서 what 함수 호출시
유저가 작성한 what이 호출되지 않게 됨...
-> 즉, 객체 슬라이싱이 발생함.
전문가 c++ p.736
: 예외 없음을 나타내는 키워드
예외가 있음을 나타내려면
-> noexcept를 붙이지 않거나, noexcept(false)를 함수 뒤에 작성
예외 없을
-> noexcept를 함수뒤에 작성하거나, noexcept(true)를 작성.
: 이동 생성자와 이동 대입연산자 작성시에 반드시 noexcept를 작성하자.
-> vector 사용시 특정 함수 emplace_back 사용시 문제될 수 있음.
-> 이동 중에 예외 발생시, 이동처리된 자원의 경우, 처리를 할수 없다.
만약 복사라고 한다면, 자원 원본이 있어서 문제 없음.
: 예외가 없는 함수가 컴파일러 최적화가 잘 됨.
: noexcept( 함수 호출식 ) 을 통해 확인하자.