가티있는블로그

[C++] exception 예외처리

2021. 8. 22. 00:40 | 프로그래밍/C++

함수가 실패하면 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