이전 글에서 SafeInt를 사용하여 정수 연상을 할 때 오버플로우가 발생할 때 예외처리를 하지 않으면 릴리즈 모드에서는 크래쉬가 발생한다고 하였습니다. 그래서 SafeInt를 사용할 때 꼭 예외처리를 사용해야 합니다.
< 코드 1. SafeInt 연산 시 예외처리 구현 >
#include <iostream>
#include <safeint.h>
using namespace msl::utilities;
int main()
{
SafeInt<unsigned int> X1(1234567);
SafeInt<unsigned int> X2(1234567);
try
{
SafeInt<unsigned int> X3 = X1 * X2;
}
catch(SafeIntException e)
{
std::cout << "overflow!!. ErrorCode : " << e.m_code << std::endl;
}
getchar();
return 0;
}
< 결과 >
<코드 1>의 결과를 보면 예외 처리에 의해서 프로그램이 크래쉬 되지 않음을 알 수 있습니다. 그런데 SafeInt를 사용할 때마다 <코드1> 처럼 매번 예외처리를 구현한다는 것은 너무 불편합니다. 불편하면 SafeInt를 기피하게 되겠죠. -_-
다행히 SafeInt는 이런 것도 다 감안해서 만들어져 있습니다. 사전에 예외처리를 미리 정의 해 놓으면 매번 예외처리를 정의할 필요가 없습니다.
SafeInt의 예외처리 정의는 두 가지 방법이 있습니다. 이번 회는 두 가지 방법 중 첫 번째 방법을 소개하고 두 번째 것은 다음 회에 소개 하겠습니다.
SafeInt의 예외처리 – 방법 1
SafeInt의 기본 예외 처리 클래스를 상속 받아서 우리가 원하는 방식으로 정의한 후 그것을 SafeInt의 생성자에 인자로 넘겨주면 SafeInt로 연산 작업을 할 때 예외가 발생하면 우리가 정의한 예외처리를 호출합니다. 백문이불여일견이라고 바로 다음의 코드를 봐 주세요. 아주 간단합니다.
< 코드 2. SafeInt의 예외처리 방법 1 >
#include <iostream>
#include <safeint.h>
using namespace msl::utilities;
class MySafeIntException : public SafeIntException
{
public:
static void SafeIntOnOverflow()
{
std::cout << "Overflow 발생!!" << std::endl;
}
static void SafeIntOnDivZero()
{
std::cout << "0으로 나누기 발생!!" << std::endl;
}
};
int main()
{
SafeInt<unsigned int, MySafeIntException> X1(1234567);
SafeInt<unsigned int, MySafeIntException> X2(1234567);
SafeInt<unsigned int, MySafeIntException> X3 = X1 * X2;
getchar();
return 0;
}
< 결과 >
<코드 2>의 결과를 보면 SafeInt로 연산 작업을 할 때 예외처리를 같이 정의하지 않아도 오버플로우로가 발생하면 우리가 정의한 클래스의 멤버 함수를 호출 합니다.
SafeInt의 생성자에 인자로 넘기는 예외처리 클래스는 꼭 SafeIntException 클래스를 상속 받고 static void SafeIntOnOverflow()와 static void SafeIntOnDivZero()를 재정의해야 합니다.
이것으로 <코드 1>의 예외처리 방식보다는 좀 편리해졌습니다. 그런데 아마 지금도 마음에 들지 않는 분이 있을 것 같습니다. SafeInt를 생성 할 때마다 매번 예외처리 클래스를 인자로 넘기는 것도 귀찮은 분이 있을 것 같네요. 이런 분들을 위해서 SafeInt는 또 하나더 예외처리 방법을 지원합니다. 그것은 다음 회에서 설명하겠습니다.^^
'Visual C++ 10' 카테고리의 다른 글
[SafeInt] C++에서 안전한 정수 연산을 하자 - 4 (0) | 2011.03.07 |
---|---|
[SafeInt] C++에서 안전한 정수 연산을 하자 - 3 (5) | 2011.03.02 |
[SafeInt] C++에서 안전한 정수 연산을 하자 - 1 (0) | 2011.02.14 |
VS2010 C++ 프로젝트의 디렉토리 설정 (2) | 2010.08.09 |
[Upgrade to VC++ 10] _WIN32_WINNT 버전 문제 (6) | 2010.08.02 |