프로젝트/STL 자료구조 구현
STL 자료구조 구현 (4) - 예외 처리
오의현
2024. 9. 4. 19:38
디버깅을 위해 커스텀 예외처리 클래스를 만들었다. 물론 C++에서 제공하는 예외처리 클래스가 존재하지만, 그냥 만들어보았다. 별 것도 아니고 그냥 코드 몇 줄 적으면 되는거지만 아무튼 만들어보는게 도움이 될 것 같았다.
#pragma once
#include <exception>
class CustomException
{
public:
class OutOfLange : public std::exception
{
public:
OutOfLange()
{
}
OutOfLange(const char* _ClassName)
{
ClassName = _ClassName;
}
const char* what() const noexcept override
{
static std::string ExMsg = "Exception is detected : OutOfLange\nClassName : " + ClassName;
return ExMsg.c_str();
}
private:
std::string ClassName = "";
};
};
먼저, CustomException 클래스를 만들었고, 그 안에 예외처리 클래스를 넣어두었다.
CustomException은 일종의 네임스페이스처럼 사용되는 셈이다.
그 안에는 먼저, 범위를 초과할 때 사용될 OutOfLange 클래스를 만들었다. 해당 클래스는 std::excpetion 클래스를 상속받고 있으며 What 함수를 오버라이딩하였다.
생성자에서 클래스의 typeid를 받아 이를 저장하고, 예외처리 메세지에 사용하는 구조로 만들어주었다.
이 예외처리를 기반으로 Vector클래스 내부에 At함수를 만들었다.
DataType operator[](size_t _Index)
{
return *(BeginPtr + _Index);
}
먼저, [] 연산자는 이렇게 예외처리없이 포인터에 접근하도록 하였다. 그렇기 때문에 사이즈를 벗어난 값이 인자로 들어오면 무슨 일이 발생할 지 예측할 수 없다.
DataType At(size_t _Index)
{
try
{
if (_Index >= MySize)
{
throw CustomException::OutOfLange(typeid(*this).name());
}
}
catch (std::exception& _Error)
{
std::cerr << _Error.what() << std::endl;
}
return *(BeginPtr + _Index);
}
At함수에는 이처럼 예외처리를 해주었다.
인자가 벡터의 원소개수보다 크거나 같다면 예외를 반환하도록 하였다.
예외 객체는 위에서 만들었던 OutOfLange 클래스를 반환해주었다.
Catch에선 OutOfLange에서 오버라이딩한 what함수를 호출하여 에러메세지를 출력하도록 하였다.