티스토리 뷰
728x90
반응형
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
스타일 orPOSIX errno
스타일 병행 가능- 에러 메시지 외부 파일(json/xml) 매핑 가능
- 로그 파일 출력 또는 서버 전송도 확장 가능
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Build
- 암호화
- 패턴
- 성산블루버블
- 블루버블
- C#.NET
- DLL
- Linux
- 블루버블다이브팀
- 스쿠버다이빙
- CMake
- 외돌개
- 울릉도
- OpenSource
- 제주도
- C++
- C# 고급 기술
- 서귀포블루버블
- 블루버블다이빙팀
- 윈도우
- ip
- 서귀포
- 리눅스
- C#
- Thread
- Windows
- PowerShell
- C
- 스쿠버 다이빙
- 현포다이브
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형