c++에도 예외 처리가 있지만 중요성이 떨어짐
자바는 모든게 exception
예외 사용은 모든 언어에서 너무 남용되고 있다
C++ 자체에서 예외는 없다, 단 프로그래머가 만드것이다.
자바나 C#에 있는 예외가 c++에는 없다
EX : 범위 이탈, 0으로 나누기, NULL 객체
//[out of range]
#include <exception>
int main()
{
std::string str = "coco";
try
{
char ch = str.at(5);
}
catch(const std::out_of_range& e)
{
}
catch(const std::exception& e)
{
}
}
const size_t index = 5;
if(index < str.size())
{
char ch = str.at(index);
}
Invectory::Invectory(int count)
{
mSlots = new int[count];
}
struct SlotNullException : public std::exception
{
const char* what() const throw()
{
retrun "Slot is NULL";
}
};// 사용자 정의 예외
Invectory::Invectory(int count)
{
mSlots = new int[count];
if(mSlots == NULL)
{
throw SlotNullException(); // 예외 발생
}
}
:
Inventory* myInventory = nullptr;
try
{
myInventory = new Inventory(5);
}
catch(const SlotNullException& e)
{
std::cerr << e.what() << std::endl;
}
catch(const std::exception& e)
{
다른 에러
}
그런데 생각해 보자, 위의 코드가 올바른 예외 처리가 맞을 까??, mSlots 할당이 실패
했으니 이후 코드에서 못쓰게 만들어 줘야 하는것 아닌가??
생성자에서 쓰는 예외는 정말 괜찮을까??
메모리 부족 때문에 예외가 발생하면 어떻게 하지?
C++ vs 다른 언어들
역사적으로 Exception
C
int result = PrintAllRecord();
GetErrorCode();// 괴랄한 방식, 그리고 Errorcode를 전역 변수로 사용, 뭔 문제가 발생할 지 모름
int number;
cin >> number;
if(cin.fail()) 에러 코드 일종
{
}
if(handle != INVALID)
{
if(getStatus() != SUSPENDED)
{
if(!result)
{
:
DO SOMETHING
:
}
}
}
if(handle == INVALID)
return;
if(getStatus() == SUSPENDED)
return;
if(result == false)
return;
:
DO SOMETHING
:
public class CoffeeShop
{
:
void SetWithPoint()
{
throws EmptyItemException
{
deductPoint(customer, points);// 고객 포인트를 깍는다.
if(isEmpty(itemID))
{
throw new EmptyItemException();// 고객 포인트는 까졌는데 이제와서
} // 고객이 없다고 Exceptino 발생
}
}
:
};
public class CoffeeShop
{
:
void SetWithPoint()
{
{
if(isEmpty(itemID))
{
throw new EmptyItemException();
}
deductPoint(customer, points);
}
}
:
};
위의 코드는 간단해서 그렇제 좀만 복잡해 지면 예외 상황 처리하기가 정말 힘들어 진다.
만약 위의 함수가 5가지 예외 상황 던진다고 하면 함수 호출 할 때 5가지 예외 상황이 발생할 수 있는 것이다.
5번 호출하면 25가지 예외 상황 처리 코드가 들어간다.
근데 그 함수가 또 다른 5가지 예외 상황 발생 할 수 있는 코드를 호출하면??? X5
100% 예외 안전성을 가지는 프로그램을 짜는 게 쉬운 일이 아님
어떤 함수가 예외를 처리하지 ?
수많은 언어들에서 어떤 함수가 무슨 예외를 던지는지 알기 힘듦,
함수 헤더에 그 함수에서 던지는 예외를 표기하지 않음
viud Function4()
throw classNotFoundException
{
}
예외 처리는 보기 힘들다.
try
{
Function1(); <-- 도대체 어디서 Exception이 튀어나오는지 알 수 있을까??
}
catch(const SampleException& e)
{
...
}
Function1()
{
Function2();
}
Function2()
{
Function3();
}
Function3()
{
throw SampleException();
}
enum EError { SUCCESS, ERRROR }
struct ErrorCode
{
EError Status;
int Code;
}
template<typename T> struct result
{
ErrorCode Error;
T Value;
}
:
Result<const char*> result;
result = record.GetStudentIDByName("Pope Kim");
if(result.Error.Status == ERROR)
{
cout << "Error Codee " << result.Error.Code << endl;
}
else
{
cout << result.Value << endl;
}
예외 처리를 완전히 사용 못한다는 것은 불가능 하다.
내가 만든 프로그램, 소스코드, 수정할 수 있는 소스 코드
경계 상황
1 유효성 검사/예외는 오직 경계에서만
2 일단 시스템에 들어온 데이터는 다 올바르다고 간주할 것
3 예외 상황이 발생할 떄는 NULL을 능동적으로 사용할 것
요약
EX 1
string ReadFileOrNull(string filename) // null 반환 한다고 표시
{
if(!File.Exists(filename)) // 경계에서 유효성 검사.
{
return null;
}
try
{
return File.LoadAllText(filename); // 경계밖에서 일어날 수 있는 예외 잡음.
}
catch(Exception e)
{
return null;
}
}
int ConvertToHumanAge(const Animal* pet)// or NULL 조건이 아닌 반드시 제대로된 데이터가 들어온다.
{
Assert(pet != NULL);
:
/*
pet이 들어올 데이터가 반드시 유효할 것이라고 간주,
NULL이 들어오면 함수 사용한 사람에게 알려서 고치라고 지시
pet을 위한 예외 처리 뿐만 아니라 이 함수를 호출한 쪽에게 어떻게 문제를 처리할 지, 아니면
이 함수내에서 무었인가 처리해야 할 지 고민할 필용도 없음.
릴리즈 버전에서는 Assert는 자동으로 삭제 된다.
*/
}