execption

보물창고·2023년 1월 19일
0

c++ basic 코드누리

목록 보기
47/50
post-custom-banner

예외 처리

: 예상치 못한 오류를 잡아내는 수단.

  • 함수가 실패하면, throw 키워드를 사용해 예외를 던짐.
    -> 던져진 예외를 처리하지 않으면 프로그램은 종료됨.

😊사용방법😊

1) try ~ catch를 작성하고, try 문안에서 실행할 함수를 작성하자.
2) 함수가 어떤 타입을 반환하든 관계없이 함수 실행이 잘못된 결과를
가지고 온다면 throw 원형타입 을 작성하자.
3) catch문에서는 trhow 던지는 타입을 인자로 받는 구문을 작성하자.

  • 예시 코드
try
{
	// 실행할 함수를 작성함. 
	int ret = readFile();
}
catch( primitive type 변수명 )
{
}

특징

1) catch문을 여러개 만들 수 있음.
2) catch(...) 을 이용해 모든 종류의 예외를 잡을 수 있음.
-> 가변인자가 있는 catch 문은 반드시 마지막에 놓여야 함.

problem

: File을 read하는 함수를 만들자.

  • 힌트
  1. FILE 포인터를 생성함.
  2. "a.txt" 파일을 rt 용도로 fopen하자.
  3. 만약 열리지 않으면 throw 하자.
    : throw "???" 작성하자.
  4. 이어서 fclose 하자.
  • 정답 코드
    : 블로그

예외와 클래스

  • 이전에는 원형 타입을 throw 해서 catch문으로 받았음.
    -> 클래스를 throw 할 수 있음.

  • c++에서는 예외 전용 클래스가 있음.
    : 이를 상속한 후, 가상함수인 what을 이용해 예외처리할 수 있음.

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 키워드 -> move에서 사용함.

: 예외 없음을 나타내는 키워드

  • 예외가 있음을 나타내려면
    -> noexcept를 붙이지 않거나, noexcept(false)를 함수 뒤에 작성

  • 예외 없을
    -> noexcept를 함수뒤에 작성하거나, noexcept(true)를 작성.

반드시 작성해야 하는 경우.

: 이동 생성자와 이동 대입연산자 작성시에 반드시 noexcept를 작성하자.
-> vector 사용시 특정 함수 emplace_back 사용시 문제될 수 있음.
-> 이동 중에 예외 발생시, 이동처리된 자원의 경우, 처리를 할수 없다.
만약 복사라고 한다면, 자원 원본이 있어서 문제 없음.

왜 표기할까?

: 예외가 없는 함수가 컴파일러 최적화가 잘 됨.

예외 없음을 조사하는 방법.

: noexcept( 함수 호출식 ) 을 통해 확인하자.

profile
🔥🔥🔥
post-custom-banner

0개의 댓글