467 lines
23 KiB
C++
467 lines
23 KiB
C++
/*!
|
||
* \file RyeolException.cpp
|
||
* \brief Implementations of Ryeol's exception classes.
|
||
* \author Jo Hyeong-ryeol
|
||
* \since 2004.04.12
|
||
* \version $LastChangedRevision: 89 $
|
||
* $LastChangedDate: 2006-01-30 11:20:19 +0900 (월, 30 1 2006) $
|
||
*
|
||
* This file contains implementations of exception classes.
|
||
* \n\n\n
|
||
* Copyright © 2006 by <a href="mailto:hyeongryeol@gmail.com">Jo Hyeong-ryeol</a>\n
|
||
* Permission to copy, use, modify, sell and distribute this software is
|
||
* granted provided this copyright notice appears in all copies.
|
||
* This software is provided "as is" without express or implied warranty,
|
||
* and with no claim as to its suitability for any purpose.
|
||
*/
|
||
#include "stdafx.h"
|
||
#include "RyeolException.h"
|
||
|
||
#ifdef _DEBUG
|
||
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
||
#endif
|
||
|
||
#pragma warning (disable: 4290) // avoids 'C++ Exception Specification ignored' message
|
||
#pragma warning (disable: 4996) // avoids 'This function or variable may be unsafe' message
|
||
|
||
|
||
/*!
|
||
* \brief The namespace of the Ryeol's library
|
||
*
|
||
* This is the namespace for source codes written by Jo Hyeong-ryeol.
|
||
*/
|
||
namespace Ryeol {
|
||
|
||
/*!
|
||
* This is a default constructor with no argument.
|
||
*/
|
||
errmsg_exceptionA::errmsg_exceptionA (void)
|
||
throw ()
|
||
{
|
||
m_szErrMsg = NULL ;
|
||
}
|
||
|
||
/*!
|
||
* This is a constructor with an initial error message.
|
||
* If memory allocation failed, the error message will not be copied
|
||
* and Internal error message will point to NULL.
|
||
*
|
||
* \param szErrMsg [in] An initial error message.
|
||
*/
|
||
errmsg_exceptionA::errmsg_exceptionA (LPCSTR szErrMsg)
|
||
throw ()
|
||
{
|
||
m_szErrMsg = NULL ;
|
||
if ( szErrMsg == NULL )
|
||
return ;
|
||
|
||
seterrmsg (szErrMsg) ;
|
||
}
|
||
|
||
/*!
|
||
* This is a copy constructor.
|
||
* If memory allocation failed, the error message will not be copied
|
||
* and Internal error message will point to NULL.
|
||
*
|
||
* \param ee [in] An errmsg_exceptionA object.
|
||
*/
|
||
errmsg_exceptionA::errmsg_exceptionA (const errmsg_exceptionA & ee)
|
||
throw ()
|
||
{
|
||
m_szErrMsg = NULL ;
|
||
operator=(ee) ;
|
||
}
|
||
|
||
/*!
|
||
* This is a default destructor.
|
||
*/
|
||
errmsg_exceptionA::~errmsg_exceptionA (void)
|
||
throw ()
|
||
{
|
||
::free (m_szErrMsg) ;
|
||
}
|
||
|
||
/*!
|
||
* This method returns an error message. It guarantees that it does
|
||
* not return NULL (Returns "NULL" instead of NULL pointer).
|
||
* This method equals to the errmsg method in Ansi version.
|
||
*
|
||
* \return A message describing the error.
|
||
* \sa errmsg
|
||
*/
|
||
LPCSTR errmsg_exceptionA::what (void) const
|
||
throw ()
|
||
{
|
||
return errmsg () ;
|
||
}
|
||
|
||
/*!
|
||
* This method returns an error message. It guarantees that it does
|
||
* not return NULL (Returns "NULL" instead of NULL pointer).
|
||
*
|
||
* \return A message describing the error.
|
||
*/
|
||
LPCSTR errmsg_exceptionA::errmsg (void) const
|
||
throw ()
|
||
{
|
||
if ( m_szErrMsg == NULL )
|
||
return "NULL" ;
|
||
|
||
return m_szErrMsg ;
|
||
}
|
||
|
||
/*!
|
||
* This method assigns a new error message. If memory allocation failed,
|
||
* NULL is assigned.
|
||
*
|
||
* \param szErrMsg A new error message.
|
||
*/
|
||
void errmsg_exceptionA::seterrmsg (LPCSTR szErrMsg)
|
||
throw ()
|
||
{
|
||
::free (m_szErrMsg) ;
|
||
m_szErrMsg = NULL ;
|
||
|
||
if ( szErrMsg == NULL )
|
||
return ;
|
||
|
||
size_t cchErrMsg = ::strlen (szErrMsg) ;
|
||
m_szErrMsg = (LPSTR) ::malloc (sizeof (CHAR) * (cchErrMsg + 1)) ;
|
||
if ( m_szErrMsg == NULL )
|
||
return ;
|
||
|
||
::strcpy (m_szErrMsg, szErrMsg) ;
|
||
}
|
||
|
||
/*!
|
||
* This operator assigns an error message using seterrmsg method.
|
||
* If memory allocation failed, the error message will not be copied
|
||
* and Internal error message will point to NULL.
|
||
*
|
||
* \param ee [in] An errmsg_exceptionA object.
|
||
* \return The exception object itself.
|
||
*/
|
||
errmsg_exceptionA & errmsg_exceptionA::operator=(const errmsg_exceptionA & ee)
|
||
throw ()
|
||
{
|
||
if ( this == &ee )
|
||
return *this ;
|
||
|
||
seterrmsg (ee.errmsg ()) ;
|
||
return *this ;
|
||
}
|
||
|
||
|
||
/*!
|
||
* This is a default constructor with no argument.
|
||
*/
|
||
errmsg_exceptionW::errmsg_exceptionW (void)
|
||
throw ()
|
||
{
|
||
m_szErrMsg = NULL ;
|
||
}
|
||
|
||
/*!
|
||
* This is a constructor with an initial error message.
|
||
* If memory allocation failed, the error message will not be copied
|
||
* and Internal error message will point to NULL.
|
||
*
|
||
* \param szErrMsg [in] An initial error message.
|
||
*/
|
||
errmsg_exceptionW::errmsg_exceptionW (LPCWSTR szErrMsg)
|
||
throw ()
|
||
{
|
||
m_szErrMsg = NULL ;
|
||
if ( szErrMsg == NULL )
|
||
return ;
|
||
|
||
seterrmsg (szErrMsg) ;
|
||
}
|
||
|
||
/*!
|
||
* This is a copy constructor.
|
||
* If memory allocation failed, the error message will not be copied
|
||
* and Internal error message will point to NULL.
|
||
*
|
||
* \param ee [in] An errmsg_exceptionA object.
|
||
*/
|
||
errmsg_exceptionW::errmsg_exceptionW (const errmsg_exceptionW & ee)
|
||
throw ()
|
||
{
|
||
operator=(ee) ;
|
||
}
|
||
|
||
/*!
|
||
* This is a default destructor.
|
||
*/
|
||
errmsg_exceptionW::~errmsg_exceptionW (void)
|
||
throw ()
|
||
{
|
||
::free (m_szErrMsg) ;
|
||
}
|
||
|
||
/*!
|
||
* This is not supported in Unicode version.
|
||
* It always returns "errmsg_exceptionW".
|
||
*
|
||
* \return "errmsg_exceptionW"
|
||
*/
|
||
LPCSTR errmsg_exceptionW::what (void) const
|
||
throw ()
|
||
{
|
||
return "errmsg_exceptionW" ;
|
||
}
|
||
|
||
/*!
|
||
* This method returns an error message. It guarantees that it does
|
||
* not return NULL (Returns "NULL" instead of NULL pointer).
|
||
*
|
||
* \return A message describing the error.
|
||
*/
|
||
LPCWSTR errmsg_exceptionW::errmsg (void) const
|
||
throw ()
|
||
{
|
||
if ( m_szErrMsg == NULL )
|
||
return L"NULL" ;
|
||
|
||
return m_szErrMsg ;
|
||
}
|
||
|
||
/*!
|
||
* This method assigns a new error message. If memory allocation failed,
|
||
* NULL is assigned.
|
||
*
|
||
* \param szErrMsg A new error message.
|
||
*/
|
||
void errmsg_exceptionW::seterrmsg (LPCWSTR szErrMsg)
|
||
throw ()
|
||
{
|
||
::free (m_szErrMsg) ;
|
||
m_szErrMsg = NULL ;
|
||
|
||
if ( szErrMsg == NULL )
|
||
return ;
|
||
|
||
size_t cchErrMsg = ::wcslen (szErrMsg) ;
|
||
m_szErrMsg = (LPWSTR) ::malloc (sizeof (WCHAR) * (cchErrMsg + 1)) ;
|
||
if ( m_szErrMsg == NULL )
|
||
return ;
|
||
|
||
::wcscpy (m_szErrMsg, szErrMsg) ;
|
||
}
|
||
|
||
/*!
|
||
* This operator assigns an error message using seterrmsg method.
|
||
* If memory allocation failed, the error message will not be copied
|
||
* and Internal error message will point to NULL.
|
||
*
|
||
* \param ee [in] An errmsg_exceptionA object.
|
||
* \return The exception object itself.
|
||
*/
|
||
errmsg_exceptionW & errmsg_exceptionW::operator=(const errmsg_exceptionW & ee)
|
||
throw ()
|
||
{
|
||
if ( this == &ee )
|
||
return *this ;
|
||
|
||
seterrmsg (ee.m_szErrMsg) ;
|
||
return *this ;
|
||
}
|
||
|
||
|
||
/*!
|
||
* This is a default constructor with no argument.
|
||
*/
|
||
varerrmsg_exceptionA::varerrmsg_exceptionA (void)
|
||
throw ()
|
||
: errmsg_exceptionA ()
|
||
{
|
||
;
|
||
}
|
||
|
||
/*!
|
||
* This is a constructor with a format string and optional arguments.
|
||
* The stored error message can not exceed EXCEPTION_BUFF_SIZE - 1 characters.
|
||
* If an error occured, the stored error messsage will be NULL.
|
||
*
|
||
* \param szErrMsg [in] A format-control error message
|
||
*/
|
||
varerrmsg_exceptionA::varerrmsg_exceptionA (LPCSTR szErrMsg, ...)
|
||
throw ()
|
||
{
|
||
va_list args ;
|
||
|
||
va_start (args, szErrMsg) ;
|
||
seterrmsg (szErrMsg, args) ;
|
||
va_end (args) ;
|
||
}
|
||
|
||
/*!
|
||
* This is a constructor with a format string and a pointer to list of arguments.
|
||
* The stored error message can not exceed EXCEPTION_BUFF_SIZE - 1 characters.
|
||
* If an error occured, the stored error messsage will be NULL.
|
||
*
|
||
* \param szErrMsg [in] A format-control error message
|
||
* \param args [in] A pointer to list of arguments
|
||
*/
|
||
varerrmsg_exceptionA::varerrmsg_exceptionA (LPCSTR szErrMsg, va_list args)
|
||
throw ()
|
||
{
|
||
seterrmsg (szErrMsg, args) ;
|
||
}
|
||
|
||
/*!
|
||
* This method assigns a new error message using _vsnprintf.
|
||
* The stored error message can not exceed EXCEPTION_BUFF_SIZE - 1 characters.
|
||
* If an error occured, the stored error messsage will be NULL.
|
||
*
|
||
* \param szErrMsg [in] A format-control error message
|
||
*/
|
||
void varerrmsg_exceptionA::seterrmsg (LPCSTR szErrMsg, ...)
|
||
throw ()
|
||
{
|
||
va_list args ;
|
||
|
||
va_start (args, szErrMsg) ;
|
||
seterrmsg (szErrMsg, args) ;
|
||
va_end (args) ;
|
||
}
|
||
|
||
/*!
|
||
* This method assigns a new error message using _vsnprintf.
|
||
* The stored error message can not exceed EXCEPTION_BUFF_SIZE - 1 characters.
|
||
* If an error occured, the stored error messsage will be NULL.
|
||
*
|
||
* \param szErrMsg [in] A format-control error message
|
||
* \param args [in] A pointer to list of arguments
|
||
*/
|
||
void varerrmsg_exceptionA::seterrmsg (LPCSTR szErrMsg, va_list args)
|
||
throw ()
|
||
{
|
||
if ( szErrMsg == NULL ) {
|
||
errmsg_exceptionA::seterrmsg (szErrMsg) ;
|
||
return ;
|
||
}
|
||
|
||
CHAR szBuff[EXCEPTION_BUFF_SIZE] ;
|
||
int cchWritten ;
|
||
cchWritten = _vsnprintf (szBuff, EXCEPTION_BUFF_SIZE - 1, szErrMsg, args) ;
|
||
|
||
// If the error message exceeds the buffer size...
|
||
if ( cchWritten == -1 )
|
||
szBuff[EXCEPTION_BUFF_SIZE - 1] = '\0' ;
|
||
// If an error occured..
|
||
else if ( cchWritten < 0 ) {
|
||
errmsg_exceptionA::seterrmsg (NULL) ;
|
||
return ;
|
||
} else
|
||
szBuff[cchWritten] = '\0' ;
|
||
|
||
errmsg_exceptionA::seterrmsg (szBuff) ;
|
||
}
|
||
|
||
|
||
/*!
|
||
* This is a default constructor with no argument.
|
||
*/
|
||
varerrmsg_exceptionW::varerrmsg_exceptionW (void)
|
||
throw ()
|
||
: errmsg_exceptionW ()
|
||
{
|
||
;
|
||
}
|
||
|
||
/*!
|
||
* This is a constructor with a format string and optional arguments.
|
||
* The stored error message can not exceed EXCEPTION_BUFF_SIZE - 1 characters.
|
||
* If an error occured, the stored error messsage will be NULL.
|
||
*
|
||
* \param szErrMsg [in] A format-control error message
|
||
*/
|
||
varerrmsg_exceptionW::varerrmsg_exceptionW (LPCWSTR szErrMsg, ...)
|
||
throw ()
|
||
{
|
||
va_list args ;
|
||
|
||
va_start (args, szErrMsg) ;
|
||
seterrmsg (szErrMsg, args) ;
|
||
va_end (args) ;
|
||
}
|
||
|
||
/*!
|
||
* This is a constructor with a format string and a pointer to list of arguments.
|
||
* The stored error message can not exceed EXCEPTION_BUFF_SIZE - 1 characters.
|
||
* If an error occured, the stored error messsage will be NULL.
|
||
*
|
||
* \param szErrMsg [in] A format-control error message
|
||
* \param args [in] A pointer to list of arguments
|
||
*/
|
||
varerrmsg_exceptionW::varerrmsg_exceptionW (LPCWSTR szErrMsg, va_list args)
|
||
throw ()
|
||
{
|
||
seterrmsg (szErrMsg, args) ;
|
||
}
|
||
|
||
/*!
|
||
* This is not supported in Unicode version.
|
||
* It always returns "varerrmsg_exceptionW".
|
||
*
|
||
* \return "varerrmsg_exceptionW"
|
||
*/
|
||
LPCSTR varerrmsg_exceptionW::what () const
|
||
throw ()
|
||
{
|
||
return "varerrmsg_exceptionW" ;
|
||
}
|
||
|
||
/*!
|
||
* This method assigns a new error message using _vsnwprintf.
|
||
* The stored error message can not exceed EXCEPTION_BUFF_SIZE - 1 characters.
|
||
* If an error occured, the stored error messsage will be NULL.
|
||
*
|
||
* \param szErrMsg [in] A format-control error message
|
||
*/
|
||
void varerrmsg_exceptionW::seterrmsg (LPCWSTR szErrMsg, ...)
|
||
throw ()
|
||
{
|
||
va_list args ;
|
||
|
||
va_start (args, szErrMsg) ;
|
||
seterrmsg (szErrMsg, args) ;
|
||
va_end (args) ;
|
||
}
|
||
|
||
/*!
|
||
* This method assigns a new error message using _vsnwprintf.
|
||
* The stored error message can not exceed EXCEPTION_BUFF_SIZE - 1 characters.
|
||
* If an error occured, the stored error messsage will be NULL.
|
||
*
|
||
* \param szErrMsg [in] A format-control error message
|
||
* \param args [in] A pointer to list of arguments
|
||
*/
|
||
void varerrmsg_exceptionW::seterrmsg (LPCWSTR szErrMsg, va_list args)
|
||
throw ()
|
||
{
|
||
if ( szErrMsg == NULL ) {
|
||
errmsg_exceptionW::seterrmsg (szErrMsg) ;
|
||
return ;
|
||
}
|
||
|
||
WCHAR szBuff[EXCEPTION_BUFF_SIZE] ;
|
||
int cchWritten ;
|
||
cchWritten = _vsnwprintf (szBuff, EXCEPTION_BUFF_SIZE - 1, szErrMsg, args) ;
|
||
|
||
// If the error message exceeds the buffer size...
|
||
if ( cchWritten == -1 )
|
||
szBuff[EXCEPTION_BUFF_SIZE - 1] = '\0' ;
|
||
// If an error occured..
|
||
else if ( cchWritten < 0 ) {
|
||
errmsg_exceptionW::seterrmsg (NULL) ;
|
||
return ;
|
||
} else
|
||
szBuff[cchWritten] = '\0' ;
|
||
|
||
errmsg_exceptionW::seterrmsg (szBuff) ;
|
||
}
|
||
|
||
}
|