본문 바로가기
프로그래밍 언어/C++

[C++] 오류 처리 방식 (Error Handling)

by 까망 하르방 2025. 3. 17.
반응형

오류 처리 방식 (Error Handling)

① 약속된 함수 반환값
② 예외(Exception) 사용
③ 성공/실패 결과가 모두 담을 수 있는 타입 반환


[예제]

Connect 실패 시 어떻게 처리할 것인가?

→ 프로세스 종료하거나 오류 처리를 해주어야 한다.

int connect()
{
	// sth...
}

int main()
{
	connect();
}



[예제] 약속된 반환값

#define ERROR (-1)

int connect()
{
	bool ret = false;

	// Sth...
	
	if (ret == false)
	{
		return ERROR;
	}
}

int main()
{
	connect();
}


[단점]
간단한 함수라면 약속된 반환 값으로 처리할 수 있지만
해당 반환 값이 어떤 의미인지 숙지해야 한다.
ex) 반환 값이 실제 오류인지 정상 반환 값인지

또한, 호출자가 발생된 오류를 무시할 수 있다.
즉 반환 값을 Handling 해주어야 한다.


[예제] throw

#include <iostream>

#define ERROR (-1)

int connect()
{
	bool ret = false;

	// Sth...
	
	if (ret == false)
	{
		throw ERROR;
	}

        // 예외 없는 경우만 실행하게 됨.
        printf("harbang...\n");
}

int main()
{
	try
	{
		int ret = connect();
	}
	catch (int e)
	{
		printf("error...\n");
	}
	catch (...)
	{
		printf("etc error...\n");
	}
	
}

 


함수 실패시 throw 키워드로 예외 전달
throw 하게 되면 더 이상 실행되지 않고 catch 문으로 이동
호출자가 던져진 예외를 처리하지 않으면 프로그램 종료 (abort() 함수 호출)
→ 함수 반환 값과 오류 전달이 구분된다.
→ 호출자에게 오류 처리를 강제할 수 있다.

 


[예제] 구체적인 오류 정보 전달

이름 만으로도 가독성이 좋아지기 때문에
타입을 설계해서 객체 반환 해볼 수 있다.

#include <iostream>

class FileNotFound {};
class NetworkDisconnected {};

int connect()
{
	int ret = 2;
	
	if (ret == 1) throw FileNotFound{};
	if (ret == 2) throw NetworkDisconnected{};
}

int main()
{
	try
	{
		int ret = connect();
	}
	catch (const FileNotFound& e)
	{
		printf("File Not Found\n");
	}
	catch (const NetworkDisconnected& e)
	{
		printf("Network Disconnected\n");
	}
	catch (...)
	{
		printf("etc error...\n");
	}
	
}

 

 

[예제] Standard Exception

#include <iostream>
#include <string>

int main()
{
	try
	{
		int n = std::stoi("KK");

		printf("%d\n", n);
	}
	catch (const std::invalid_argument& e)
	{
		printf("1... what : %s\n", e.what());
	}
	catch (const std::exception& e) // = catch(...)
	{
		printf("2... what : %s\n", e.what());
	}
}

 

 

std::stoi() 에서 변경할 수 없는 문자열이 전달되면
std::invalid_argument 타입의 예외 발생

모든 C++ 예외 클래스는 std::exception 클래스로 부터 파생된다.
모든 예외 타입에는 "what" 가상함수가 있다.

반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

[C++] noexcept  (3) 2025.03.20
[C++] RAII & stack unwinding  (1) 2025.03.19
[C++] 깊은 복사 (Deep Copy)  (2) 2025.03.16
[C++] 함수 객체 (function object)  (2) 2025.03.15
[C++] 상속과 복사/대입 연산자  (0) 2025.03.14

댓글