티스토리 뷰

728x90
반응형
C++ 크로스 플랫폼 에러 처리 시스템 설계

C++ 크로스 플랫폼 에러 처리 시스템 설계

✅ 개요

Windows의 GetLastError()와 같은 방식의 에러 핸들링 시스템을 C++로 구현합니다. 이 시스템은 다음을 포함합니다:

  • Thread Local Storage 기반 에러 저장
  • 프로젝트 공통 에러 코드 정의
  • 에러 메시지 출력 (다국어 지원 가능)
  • 에러 로그 기록
  • 운영체제의 시스템 에러 코드 매핑

1. ❌ 에러 코드 정의 - ErrorCode.hpp

enum class ErrorCode {
    OK = 0,
    UNKNOWN,
    INVALID_PARAM,
    NULL_POINTER,
    FILE_NOT_FOUND,
    TIMEOUT,
    NETWORK_FAIL,
    PERMISSION_DENIED,
    SYSTEM_ERROR,
};

2. TLS 기반 에러 상태 저장 - ErrorManager

class ErrorManager {
public:
    static void SetLastError(ErrorCode _err);
    static ErrorCode GetLastError();
    static ErrorCode GetAndClearLastError();
    static void ClearLastError();

private:
    static thread_local ErrorCode s_tlsLastError;
};

thread_local ErrorCode ErrorManager::s_tlsLastError = ErrorCode::OK;

void ErrorManager::SetLastError(ErrorCode _err) {
    s_tlsLastError = _err;
}

ErrorCode ErrorManager::GetLastError() {
    return s_tlsLastError;
}

ErrorCode ErrorManager::GetAndClearLastError() {
    ErrorCode temp = s_tlsLastError;
    s_tlsLastError = ErrorCode::OK;
    return temp;
}

void ErrorManager::ClearLastError() {
    s_tlsLastError = ErrorCode::OK;
}

3. 오류 메시지 매핑 - ErrorMessage

enum class Locale { ENGLISH, KOREAN };

class ErrorMessage {
public:
    static std::string ToString(ErrorCode _err, Locale _locale);
};

std::string ErrorMessage::ToString(ErrorCode _err, Locale _locale) {
    switch (_locale) {
        case Locale::KOREAN:
            switch (_err) {
                case ErrorCode::OK: return "성공";
                case ErrorCode::INVALID_PARAM: return "잘못된 파라미터";
                case ErrorCode::NULL_POINTER: return "널 포인터";
                case ErrorCode::FILE_NOT_FOUND: return "파일을 찾을 수 없음";
                case ErrorCode::PERMISSION_DENIED: return "권한 없음";
                default: return "알 수 없는 에러";
            }
        case Locale::ENGLISH:
        default:
            switch (_err) {
                case ErrorCode::OK: return "Success";
                case ErrorCode::INVALID_PARAM: return "Invalid parameter";
                case ErrorCode::NULL_POINTER: return "Null pointer";
                case ErrorCode::FILE_NOT_FOUND: return "File not found";
                case ErrorCode::PERMISSION_DENIED: return "Permission denied";
                default: return "Unknown error";
            }
    }
}

4. 로그 기록 - ErrorLogger

class ErrorLogger {
public:
    static void Log(ErrorCode _err, const char* _file, int _line);
};

void ErrorLogger::Log(ErrorCode _err, const char* _file, int _line) {
    std::cerr << "[ERROR] (" << _file << ":" << _line << ") "
              << static_cast(_err) << " - "
              << ErrorMessage::ToString(_err, Locale::ENGLISH)
              << std::endl;
}

#define LOG_ERROR(_err) ErrorLogger::Log(_err, __FILE__, __LINE__)

5. 시스템 에러 코드 매핑 - SystemErrorMapper

#include 

ErrorCode MapSystemErrorCode() {
    switch (errno) {
        case ENOENT: return ErrorCode::FILE_NOT_FOUND;
        case EACCES: return ErrorCode::PERMISSION_DENIED;
        default: return ErrorCode::SYSTEM_ERROR;
    }
}

현황 사용 예시

void LoadFile() {
    ErrorManager::SetLastError(ErrorCode::FILE_NOT_FOUND);
    LOG_ERROR(ErrorManager::GetLastError());
}

✔️ 정보 추가

  • GetLastError() - 값을 유지한 채 반환 (Windows 스타일)
  • GetAndClearLastError() - 가져오며 자동 초기화 (옵션)
  • 에러 메시지 다국어 지원 구조
  • 로깅과 시스템 에러 매핑 분리 구조

확장 방향

  • HRESULT 스타일 or POSIX errno 스타일 병행 가능
  • 에러 메시지 외부 파일(json/xml) 매핑 가능
  • 로그 파일 출력 또는 서버 전송도 확장 가능
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함
반응형