290 lines
7.7 KiB
C
290 lines
7.7 KiB
C
|
#ifndef _INC_DSKQUOTA_EXCEPT_H
|
||
|
#define _INC_DSKQUOTA_EXCEPT_H
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
/* File: except.h
|
||
|
|
||
|
Description: Basic exception class hierarchy.
|
||
|
|
||
|
I shamelessly based this on the MFC exception hierarchy.
|
||
|
|
||
|
CException
|
||
|
CMemoryException - i.e. "Out of memory", "invalid index"
|
||
|
CFileException - i.e. "device IO error"
|
||
|
CSyncException - i.e. "mutext abandoned"
|
||
|
CResourceException - i.e. "resource not found in image"
|
||
|
COleException - i.e. "some critical OLE error"
|
||
|
CNotSupportedException - i.e. "function not supported"
|
||
|
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Date Description Programmer
|
||
|
-------- --------------------------------------------------- ----------
|
||
|
09/16/97 Initial creation. BrianAu
|
||
|
*/
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
#ifndef _WINDOWS_
|
||
|
# include <windows.h>
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//
|
||
|
// Very naive string implementation. Just need something simple to hold
|
||
|
// strings in exception objects when necessary.
|
||
|
// Ensures proper cleanup on dtor.
|
||
|
// Can't use CString here (I wanted to) because that creates a circular
|
||
|
// reference condition between strclass.h and except.h
|
||
|
//
|
||
|
class CExceptionString
|
||
|
{
|
||
|
public:
|
||
|
explicit CExceptionString(LPCTSTR pszText = TEXT(""));
|
||
|
~CExceptionString(void)
|
||
|
{ delete[] m_pszText; }
|
||
|
|
||
|
CExceptionString(const CExceptionString& rhs);
|
||
|
CExceptionString& operator = (const CExceptionString& rhs);
|
||
|
|
||
|
const TCHAR * const GetTextPtr(void) const
|
||
|
{ return m_pszText; }
|
||
|
|
||
|
private:
|
||
|
LPTSTR m_pszText;
|
||
|
|
||
|
LPTSTR Dup(LPCTSTR psz);
|
||
|
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Base class for all exceptions.
|
||
|
//
|
||
|
class CException
|
||
|
{
|
||
|
public:
|
||
|
enum reason { none };
|
||
|
explicit CException(DWORD r) : m_reason(r) { }
|
||
|
|
||
|
DWORD Reason(void) const { return m_reason; }
|
||
|
|
||
|
#if DBG
|
||
|
virtual LPCTSTR NameText(void) const
|
||
|
{ return TEXT("CException"); }
|
||
|
|
||
|
virtual LPCTSTR ReasonText(void) const
|
||
|
{ return TEXT("Unknown"); }
|
||
|
#endif // DBG
|
||
|
|
||
|
private:
|
||
|
DWORD m_reason;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Exception class representing different "bad" things associated
|
||
|
// with memory use.
|
||
|
//
|
||
|
class CMemoryException : public CException
|
||
|
{
|
||
|
public:
|
||
|
enum reason { alloc, // Memory allocation failure.
|
||
|
overflow, // Memory overflow.
|
||
|
index, // Bad index value.
|
||
|
range, // Value overrange for data type.
|
||
|
pointer, // Bad pointer (i.e. NULL).
|
||
|
num_reasons
|
||
|
};
|
||
|
explicit CMemoryException(reason r) : CException((DWORD)r) { }
|
||
|
|
||
|
#if DBG
|
||
|
virtual LPCTSTR NameText(void) const
|
||
|
{ return TEXT("CMemoryException"); }
|
||
|
|
||
|
virtual LPCTSTR ReasonText(void) const
|
||
|
{ return m_pszReasons[Reason()]; }
|
||
|
private:
|
||
|
static LPCTSTR m_pszReasons[num_reasons];
|
||
|
|
||
|
#endif // DBG
|
||
|
};
|
||
|
|
||
|
class CAllocException : private CMemoryException
|
||
|
{
|
||
|
public:
|
||
|
CAllocException(void) : CMemoryException(CMemoryException::alloc) { }
|
||
|
|
||
|
#if DBG
|
||
|
virtual LPCTSTR NameText(void) const
|
||
|
{ return TEXT("CAllocException"); }
|
||
|
|
||
|
virtual LPCTSTR ReasonText(void) const
|
||
|
{ return CMemoryException::ReasonText(); }
|
||
|
|
||
|
#endif // DBG
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Exception class representing file I/O errors.
|
||
|
//
|
||
|
class CFileException : public CException
|
||
|
{
|
||
|
public:
|
||
|
enum reason { create, // Can't create file.
|
||
|
read, // Can't read file.
|
||
|
write, // Can't write file.
|
||
|
diskfull, // Disk is full.
|
||
|
access, // No access.
|
||
|
device, // Device write error.
|
||
|
num_reasons
|
||
|
};
|
||
|
|
||
|
CFileException(reason r, LPCTSTR pszFile, DWORD dwIoError)
|
||
|
: CException((DWORD)r),
|
||
|
m_strFile(pszFile),
|
||
|
m_dwIoError(dwIoError) { }
|
||
|
|
||
|
#if DBG
|
||
|
virtual LPCTSTR NameText(void) const
|
||
|
{ return TEXT("CFileException"); }
|
||
|
|
||
|
virtual LPCTSTR ReasonText(void) const
|
||
|
{ return m_pszReasons[Reason()]; }
|
||
|
#endif // DBG
|
||
|
|
||
|
const TCHAR * const FileName(void) const { return m_strFile.GetTextPtr(); }
|
||
|
DWORD IoError(void) const { return m_dwIoError; }
|
||
|
|
||
|
private:
|
||
|
DWORD m_dwIoError;
|
||
|
CExceptionString m_strFile;
|
||
|
#if DBG
|
||
|
static LPCTSTR m_pszReasons[num_reasons];
|
||
|
#endif // DBG
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Thread synchronization object exception.
|
||
|
//
|
||
|
class CSyncException : public CException
|
||
|
{
|
||
|
public:
|
||
|
enum object { mutex, critsect, semaphore, event, thread, process, num_objects };
|
||
|
enum reason { create, timeout, abandoned, num_reasons };
|
||
|
CSyncException(object obj, reason r)
|
||
|
: CException(r),
|
||
|
m_object(obj) { }
|
||
|
|
||
|
#if DBG
|
||
|
virtual LPCTSTR NameText(void) const
|
||
|
{ return TEXT("CSyncException"); }
|
||
|
|
||
|
virtual LPCTSTR ReasonText(void) const
|
||
|
{ return m_pszReasons[Reason()]; }
|
||
|
|
||
|
virtual LPCTSTR ObjectText(void) const
|
||
|
{ return m_pszObjects[Object()]; }
|
||
|
#endif // DBG
|
||
|
|
||
|
object Object(void) const { return m_object; }
|
||
|
|
||
|
private:
|
||
|
object m_object;
|
||
|
|
||
|
#if DBG
|
||
|
static LPCTSTR m_pszReasons[num_reasons];
|
||
|
static LPCTSTR m_pszObjects[num_objects];
|
||
|
#endif // DBG
|
||
|
};
|
||
|
|
||
|
|
||
|
//
|
||
|
// Windows resource exception.
|
||
|
//
|
||
|
class CResourceException : public CException
|
||
|
{
|
||
|
public:
|
||
|
enum type { accelerator,
|
||
|
anicursor,
|
||
|
aniicon,
|
||
|
bitmap,
|
||
|
cursor,
|
||
|
dialog,
|
||
|
font,
|
||
|
fontdir,
|
||
|
group_cursor,
|
||
|
group_icon,
|
||
|
icon,
|
||
|
menu,
|
||
|
messagetable,
|
||
|
rcdata,
|
||
|
string,
|
||
|
version,
|
||
|
num_reasons };
|
||
|
|
||
|
CResourceException(type t, HINSTANCE hInstance, UINT uResId)
|
||
|
: CException(CException::none),
|
||
|
m_type(t),
|
||
|
m_uResId(uResId),
|
||
|
m_hInstance(hInstance) { }
|
||
|
|
||
|
#if DBG
|
||
|
virtual LPCTSTR NameText(void) const
|
||
|
{ return TEXT("CResourceException"); }
|
||
|
|
||
|
virtual LPCTSTR ReasonText(void) const;
|
||
|
|
||
|
#endif // DBG
|
||
|
|
||
|
HINSTANCE Module(void) const { return m_hInstance; }
|
||
|
enum type Type(void) const { return m_type; }
|
||
|
|
||
|
private:
|
||
|
enum type m_type;
|
||
|
UINT m_uResId;
|
||
|
HINSTANCE m_hInstance;
|
||
|
|
||
|
#if DBG
|
||
|
static LPCTSTR m_pszReasons[num_reasons];
|
||
|
#endif // DBG
|
||
|
};
|
||
|
|
||
|
|
||
|
class COleException : public CException
|
||
|
{
|
||
|
public:
|
||
|
explicit COleException(HRESULT hr)
|
||
|
: CException(CException::none),
|
||
|
m_hr(hr) { }
|
||
|
|
||
|
HRESULT Result(void) const { return m_hr; }
|
||
|
|
||
|
#if DBG
|
||
|
virtual LPCTSTR NameText(void) const
|
||
|
{ return TEXT("COleException"); }
|
||
|
virtual LPCTSTR ReasonText(void) const
|
||
|
{ return TEXT("not applicable"); }
|
||
|
#endif // DBG
|
||
|
|
||
|
private:
|
||
|
HRESULT m_hr;
|
||
|
};
|
||
|
|
||
|
|
||
|
//
|
||
|
// Some requested operation is not supported.
|
||
|
//
|
||
|
class CNotSupportedException : public CException
|
||
|
{
|
||
|
public:
|
||
|
CNotSupportedException(void) : CException(CException::none) { }
|
||
|
|
||
|
#if DBG
|
||
|
virtual LPCTSTR NameText(void) const
|
||
|
{ return TEXT("CNotSupportedException"); }
|
||
|
virtual LPCTSTR ReasonText(void) const
|
||
|
{ return TEXT("not applicable"); }
|
||
|
#endif // DBG
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
#endif // _INC_DSKQUOTA_EXCEPT_H
|