exception.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:13k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: exception.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2003/11/05 15:23:50  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI_DRIVER___EXCEPTION__HPP
  10. #define DBAPI_DRIVER___EXCEPTION__HPP
  11. /* $Id: exception.hpp,v 1000.1 2003/11/05 15:23:50 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Vladimir Soussov, Denis Vakatov
  37.  *
  38.  * File Description:  Exceptions
  39.  *
  40.  */
  41. #include <corelib/ncbistd.hpp>
  42. /** @addtogroup DbExceptions
  43.  *
  44.  * @{
  45.  */
  46. BEGIN_NCBI_SCOPE
  47. enum EDB_Severity {
  48.     eDB_Info,
  49.     eDB_Warning,
  50.     eDB_Error,
  51.     eDB_Fatal,
  52.     eDB_Unknown
  53. };
  54. class NCBI_DBAPIDRIVER_EXPORT CDB_Exception : public std::exception
  55. {
  56. public:
  57.     // exception type
  58.     enum EType {
  59.         eDS,
  60.         eRPC,
  61.         eSQL,
  62.         eDeadlock,
  63.         eTimeout,
  64.         eClient,
  65.         eMulti
  66.     };
  67.     // exception::what()
  68.     // NOTE:  it's not thread-safe!
  69.     virtual const char* what() const throw();
  70.     // access
  71.     EType          Type()            const  { return m_Type;           }
  72.     EDB_Severity   Severity()        const  { return m_Severity;       }
  73.     int            ErrCode()         const  { return m_ErrCode;        }
  74.     const string&  OriginatedFrom()  const  { return m_OriginatedFrom; }
  75.     const string&  Message()         const  { return m_Message;        }
  76.     // text representation of the exception type and severity
  77.     virtual const char* TypeString    () const = 0;
  78.     const char*         SeverityString() const
  79.     { return SeverityString(Severity()); }
  80.     static const char*  SeverityString(EDB_Severity sev);
  81.     // clone
  82.     virtual CDB_Exception* Clone() const = 0;
  83.     // destructor
  84.     virtual ~CDB_Exception() throw();
  85. protected:
  86.     // constructor
  87.     CDB_Exception(EType type, EDB_Severity severity, int err_code,
  88.                   const string& originated_from, const string& msg);
  89.     // data
  90.     EType        m_Type;
  91.     EDB_Severity m_Severity;
  92.     int          m_ErrCode;
  93.     string       m_OriginatedFrom;
  94.     string       m_Message;
  95.     // composing the text for "what()"
  96.     mutable string m_What;
  97.     virtual void x_ComposeWhat(void) const;
  98.     // standard components used to compose "what()"
  99.     string& x_StartOfWhat(string* str) const;
  100.     string& x_EndOfWhat  (string* str) const;
  101. };
  102. class NCBI_DBAPIDRIVER_EXPORT CDB_DSEx : public CDB_Exception
  103. {
  104. public:
  105.     CDB_DSEx(EDB_Severity severity, int err_code,
  106.              const string& originated_from, const string& msg)
  107.         : CDB_Exception(eDS, severity, err_code, originated_from, msg) {
  108.         return;
  109.     }
  110.     virtual const char*    TypeString() const;
  111.     virtual CDB_Exception* Clone() const;
  112. };
  113. class NCBI_DBAPIDRIVER_EXPORT CDB_RPCEx : public CDB_Exception
  114. {
  115. public:
  116.     CDB_RPCEx(EDB_Severity severity, int err_code,
  117.               const string& originated_from, const string& msg,
  118.               const string& proc_name, int proc_line);
  119.     virtual ~CDB_RPCEx() throw();
  120.     const string& ProcName()  const { return m_ProcName; }
  121.     int           ProcLine()  const { return m_ProcLine; }
  122.     virtual const char*    TypeString() const;
  123.     virtual CDB_Exception* Clone() const;
  124. protected:
  125.     virtual void x_ComposeWhat(void) const;
  126. private:
  127.     string m_ProcName;
  128.     int    m_ProcLine;
  129. };
  130. class NCBI_DBAPIDRIVER_EXPORT CDB_SQLEx : public CDB_Exception
  131. {
  132. public:
  133.     CDB_SQLEx(EDB_Severity severity, int err_code,
  134.               const string& originated_from, const string& msg,
  135.               const string& sql_state, int batch_line);
  136.     virtual ~CDB_SQLEx() throw();
  137.     const string& SqlState()   const { return m_SqlState;  }
  138.     int           BatchLine()  const { return m_BatchLine; }
  139.     virtual const char*    TypeString() const;
  140.     virtual CDB_Exception* Clone() const;
  141. protected:
  142.     virtual void x_ComposeWhat(void) const;
  143. private:
  144.     string m_SqlState;
  145.     int    m_BatchLine;
  146. };
  147. class NCBI_DBAPIDRIVER_EXPORT CDB_DeadlockEx : public CDB_Exception
  148. {
  149. public:
  150.     CDB_DeadlockEx(const string& originated_from, const string& msg)
  151.         : CDB_Exception(eDeadlock, eDB_Error, 123456, originated_from, msg)
  152.     { return; }
  153.     virtual const char*    TypeString() const;
  154.     virtual CDB_Exception* Clone() const;
  155. };
  156. class NCBI_DBAPIDRIVER_EXPORT CDB_TimeoutEx : public CDB_Exception
  157. {
  158. public:
  159.     CDB_TimeoutEx(int err_code,
  160.                   const string& originated_from, const string& msg)
  161.         : CDB_Exception(eTimeout, eDB_Error, err_code, originated_from, msg)
  162.     { return; }
  163.     virtual const char*    TypeString() const;
  164.     virtual CDB_Exception* Clone() const;
  165. };
  166. class NCBI_DBAPIDRIVER_EXPORT CDB_ClientEx : public CDB_Exception
  167. {
  168. public:
  169.     CDB_ClientEx(EDB_Severity severity, int err_code,
  170.                  const string& originated_from, const string& msg)
  171.         : CDB_Exception(eClient, severity, err_code, originated_from, msg)
  172.     { return; }
  173.     virtual const char*    TypeString() const;
  174.     virtual CDB_Exception* Clone() const;
  175. };
  176. class NCBI_DBAPIDRIVER_EXPORT CDB_MultiEx : public CDB_Exception
  177. {
  178. public:
  179.     CDB_MultiEx(const string& originated_from = kEmptyStr,
  180.                 unsigned int  capacity        = 64);
  181.     CDB_MultiEx(const CDB_MultiEx& mex);
  182.     virtual ~CDB_MultiEx() throw();
  183.     bool           Push(const CDB_Exception& ex)  { return m_Bag->Push(&ex); }
  184.     CDB_Exception* Pop(void)                      { return m_Bag->Pop();     }
  185.     unsigned int NofExceptions() const { return m_Bag->NofExceptions(); }
  186.     unsigned int Capacity()      const { return m_Bag->Capacity();      }
  187.     virtual const char*    TypeString() const;
  188.     virtual CDB_Exception* Clone() const;
  189.     // Description of this multi-exception only.
  190.     // NOTE:  method "what()" will print out this multi-exception and then
  191.     //        all exceptions bagged inside of it.
  192.     string WhatThis(void) const;
  193. protected:
  194.     virtual void x_ComposeWhat(void) const;
  195. private:
  196.     class NCBI_DBAPIDRIVER_EXPORT CDB_MultiExStorage
  197.     {
  198.     public:
  199.         string What();
  200.         void AddRef() {
  201.             ++m_RefCnt;
  202.         }
  203.         void DelRef() {
  204.             if (--m_RefCnt <= 0)
  205.                 delete this;
  206.         }
  207.         bool           Push(const CDB_Exception* ex);
  208.         CDB_Exception* Pop(void);
  209.         unsigned int NofExceptions() const { return m_NofExs;   }
  210.         unsigned int Capacity()      const { return m_NofRooms; }
  211.         CDB_MultiExStorage(unsigned int capacity);
  212.         ~CDB_MultiExStorage();
  213.     private:
  214.         unsigned int    m_NofRooms;
  215.         unsigned int    m_NofExs;
  216.         int             m_RefCnt;
  217.         CDB_Exception** m_Ex;
  218.     };
  219.     CDB_MultiExStorage* m_Bag;
  220. };
  221. /////////////////////////////////////////////////////////////////////////////
  222. //
  223. // CDB_UserHandler::   base class for user-defined handlers
  224. //
  225. //   Specializations of "CDB_UserHandler" -- to print error messages to:
  226. //
  227. // CDB_UserHandler_Default::   default destination (now:  CDB_UserHandler_Diag)
  228. // CDB_UserHandler_Diag::      C++ Toolkit diagnostics
  229. // CDB_UserHandler_Stream::    std::ostream specified by the user
  230. //
  231. class NCBI_DBAPIDRIVER_EXPORT CDB_UserHandler
  232. {
  233. public:
  234.     // Return TRUE if "ex" is processed, FALSE if not (or if "ex" is NULL)
  235.     virtual bool HandleIt(CDB_Exception* ex) = 0;
  236.     // Get current global "last-resort" error handler.
  237.     // If not set, then the default will be "CDB_UserHandler_Default".
  238.     // This handler is guaranteed to be valid up to the program termination,
  239.     // and it will call the user-defined handler last set by SetDefault().
  240.     // NOTE:  never pass it to SetDefault, like:  "SetDefault(&GetDefault())"!
  241.     static CDB_UserHandler& GetDefault(void);
  242.     // Alternate the default global "last-resort" error handler.
  243.     // Passing NULL will mean to ignore all errors that reach it.
  244.     // Return previously set (or default-default if not set yet) handler.
  245.     // The returned handler should be delete'd by the caller; the last set
  246.     // handler will be delete'd automagically on the program termination.
  247.     static CDB_UserHandler* SetDefault(CDB_UserHandler* h);
  248.     // d-tor
  249.     virtual ~CDB_UserHandler();
  250. };
  251. class NCBI_DBAPIDRIVER_EXPORT CDB_UserHandler_Diag : public CDB_UserHandler
  252. {
  253. public:
  254.     CDB_UserHandler_Diag(const string& prefix = kEmptyStr);
  255.     virtual ~CDB_UserHandler_Diag();
  256.     // Print "*ex" to the standard C++ Toolkit diagnostics, with "prefix".
  257.     // Always return TRUE (i.e. always process the "ex").
  258.     virtual bool HandleIt(CDB_Exception* ex);
  259. private:
  260.     string m_Prefix;     // string to prefix each message with
  261. };
  262. class NCBI_DBAPIDRIVER_EXPORT CDB_UserHandler_Stream : public CDB_UserHandler
  263. {
  264. public:
  265.     CDB_UserHandler_Stream(ostream*      os     = 0 /*cerr*/,
  266.                            const string& prefix = kEmptyStr,
  267.                            bool          own_os = false);
  268.     virtual ~CDB_UserHandler_Stream();
  269.     // Print "*ex" to the output stream "os", with "prefix" (as set by  c-tor).
  270.     // Return TRUE (i.e. process the "ex") unless write to "os" failed.
  271.     virtual bool HandleIt(CDB_Exception* ex);
  272. private:
  273.     ostream* m_Output;     // output stream to print messages to
  274.     string   m_Prefix;     // string to prefix each message with
  275.     bool     m_OwnOutput;  // if TRUE, then delete "m_Output" in d-tor
  276. };
  277. typedef CDB_UserHandler_Diag CDB_UserHandler_Default;
  278. END_NCBI_SCOPE
  279. /* @} */
  280. /*
  281.  * ===========================================================================
  282.  * $Log: exception.hpp,v $
  283.  * Revision 1000.1  2003/11/05 15:23:50  gouriano
  284.  * PRODUCTION: UPGRADED [ORIGINAL] Dev-tree R1.16
  285.  *
  286.  * Revision 1.16  2003/11/04 22:22:01  vakatov
  287.  * Factorize the code (especially the reporting one) through better inheritance.
  288.  * +CDB_Exception::TypeString()
  289.  * CDB_MultiEx to become more CDB_Exception-like.
  290.  * Improve the user-defined handlers' API, add CDB_UserHandler_Diag.
  291.  *
  292.  * Revision 1.15  2003/08/01 20:33:03  vakatov
  293.  * Explicitly qualify "exception" with "std::" to avoid a silly name conflict
  294.  * with <math.h> for SUN Forte6u2 compiler
  295.  *
  296.  * Revision 1.14  2003/04/11 17:46:05  siyan
  297.  * Added doxygen support
  298.  *
  299.  * Revision 1.13  2003/02/12 22:07:44  coremake
  300.  * Added export specifier NCBI_DBAPIDRIVER_EXPORT to the CDB_MultiExStorage
  301.  * class declaration
  302.  *
  303.  * Revision 1.12  2002/12/26 19:29:12  dicuccio
  304.  * Added Win32 export specifier for base DBAPI library
  305.  *
  306.  * Revision 1.11  2002/09/26 14:24:20  soussov
  307.  * raises the severity of deadlock and timeout from warning to error
  308.  *
  309.  * Revision 1.10  2002/09/04 21:45:54  vakatov
  310.  * Added missing 'const' to CDB_Exception::SeverityString()
  311.  *
  312.  * Revision 1.9  2002/07/11 18:19:19  ucko
  313.  * Simplify #includes down to <corelib/ncbistd.hpp>.
  314.  *
  315.  * Revision 1.8  2001/11/06 17:58:03  lavr
  316.  * Formatted uniformly as the rest of the library
  317.  *
  318.  * Revision 1.7  2001/10/04 20:28:08  vakatov
  319.  * Added missing virtual destructors to CDB_RPCEx and CDB_SQLEx
  320.  *
  321.  * Revision 1.6  2001/10/01 20:09:27  vakatov
  322.  * Introduced a generic default user error handler and the means to
  323.  * alternate it. Added an auxiliary error handler class
  324.  * "CDB_UserHandler_Stream".
  325.  * Moved "{Push/Pop}{Cntx/Conn}MsgHandler()" to the generic code
  326.  * (in I_DriverContext).
  327.  *
  328.  * Revision 1.5  2001/09/28 16:37:32  vakatov
  329.  * Added missing "throw()" to exception classes derived from "std::exception"
  330.  *
  331.  * Revision 1.4  2001/09/27 20:08:29  vakatov
  332.  * Added "DB_" (or "I_") prefix where it was missing
  333.  *
  334.  * Revision 1.3  2001/09/27 16:46:29  vakatov
  335.  * Non-const (was const) exception object to pass to the user handler
  336.  *
  337.  * Revision 1.2  2001/09/24 20:52:18  vakatov
  338.  * Fixed args like "string& s = 0" to "string& s = kEmptyStr"
  339.  *
  340.  * Revision 1.1  2001/09/21 23:39:52  vakatov
  341.  * -----  Initial (draft) revision.  -----
  342.  * This is a major revamp (by Denis Vakatov, with help from Vladimir Soussov)
  343.  * of the DBAPI "driver" libs originally written by Vladimir Soussov.
  344.  * The revamp involved massive code shuffling and grooming, numerous local
  345.  * API redesigns, adding comments and incorporating DBAPI to the C++ Toolkit.
  346.  *
  347.  * ===========================================================================
  348.  */
  349. #endif  /* DBAPI_DRIVER___EXCEPTION__HPP */