반응형
오류 처리 방식 (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 |
댓글