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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbiexpt.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:10:10  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbiexpt.cpp,v 1000.1 2004/06/01 19:10:10 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Andrei Gourianov,
  35.  *
  36.  * File Description:
  37.  *   test CNcbiException
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbienv.hpp>
  44. #include <corelib/ncbiargs.hpp>
  45. #include <corelib/ncbithr.hpp>
  46. #include <errno.h>
  47. BEGIN_NCBI_SCOPE
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CExceptionSubsystem
  50. #if defined(EXCEPTION_BUG_WORKAROUND)
  51. class CSubsystemException : public CException
  52. #else
  53. class CSubsystemException : virtual public CException
  54. #endif
  55. {
  56. public:
  57.     enum EErrCode {
  58.         eType1,
  59.         eType2
  60.     };
  61.     virtual const char* GetErrCodeString(void) const
  62.     {
  63.         switch (GetErrCode()) {
  64.         case eType1: return "eType1";
  65.         case eType2: return "eType2";
  66.         default:     return CException::GetErrCodeString();
  67.         }
  68.     }
  69.     NCBI_EXCEPTION_DEFAULT(CSubsystemException,CException);
  70. };
  71. /////////////////////////////////////////////////////////////////////////////
  72. // CSupersystemException
  73. class CSupersystemException : public CSubsystemException
  74. {
  75. public:
  76.     enum EErrCode {
  77.         eSuper1,
  78.         eSuper2
  79.     };
  80.     virtual const char* GetErrCodeString(void) const
  81.     {
  82.         switch (GetErrCode()) {
  83.         case eSuper1: return "eSuper1";
  84.         case eSuper2: return "eSuper2";
  85.         default:      return CException::GetErrCodeString();
  86.         }
  87.     }
  88.     NCBI_EXCEPTION_DEFAULT(CSupersystemException, CSubsystemException);
  89. };
  90. class CErrnoMoreException : public CErrnoTemplException<CCoreException>
  91. {
  92. public:
  93.     enum EErrCode {
  94.         eMore1,
  95.         eMore2
  96.     };
  97.     virtual const char* GetErrCodeString(void) const
  98.     {
  99.         switch (GetErrCode()) {
  100.         case eMore1: return "eMore1";
  101.         case eMore2: return "eMore2";
  102.         default:     return CException::GetErrCodeString();
  103.         }
  104.     }
  105.     NCBI_EXCEPTION_DEFAULT(CErrnoMoreException,CErrnoTemplException<CCoreException>);
  106. };
  107. /////////////////////////////////////////////////////////////////////////////
  108. //  CExceptApplication::
  109. class CExceptApplication : public CNcbiApplication
  110. {
  111. private:
  112.     void f1(void);
  113.     void f2(void);
  114.     void f3(void);
  115.     void f4(void);
  116.     void s1(void);
  117.     void s2(void);
  118.     void t1(void);
  119.     void m1(void);
  120.     void tp1(void);
  121. private:
  122.     virtual int  Run(void);
  123. };
  124. //---------------------------------------------------------------------------
  125. void CExceptApplication::f1(void)
  126. {
  127.     try {
  128.         f2();
  129.     }
  130.     catch (CException& e) {  // catch by reference
  131.         // verify error code
  132.         _ASSERT(e.GetErrCode() == CException::eInvalid);
  133.         // verify exception class
  134.         _ASSERT(!UppermostCast<CException>(e));
  135.         _ASSERT(UppermostCast<CSubsystemException>(e));
  136.         _ASSERT(!UppermostCast<CSupersystemException>(e));
  137.         // verify error code
  138.         const CSubsystemException *pe = UppermostCast<CSubsystemException>(e);
  139.         _ASSERT(pe->GetErrCode() == CSubsystemException::eType2);
  140.         NCBI_RETHROW_SAME(e,"calling f2 from f1");
  141.     }
  142. }
  143. void CExceptApplication::f2(void)
  144. {
  145.     try {
  146.         f3();
  147.     }
  148.     catch (CSubsystemException e) {  // catch by value
  149. /*
  150.     catching exception by value results in copying
  151.     CSupersystemException into CSubsystemException and
  152.     loosing all meaning of the "original" exception
  153.     i.e. only location and message info is preserved
  154.     while err.code becomes invalid
  155. */
  156.         // verify error code
  157.         _ASSERT((int)e.GetErrCode() == (int)CException::eInvalid);
  158.         NCBI_RETHROW(e,CSubsystemException,eType2,"calling f3 from f2");
  159.     }
  160. }
  161. void CExceptApplication::f3(void)
  162. {
  163.     try {
  164.         f4();
  165.     }
  166.     catch (CSubsystemException& e) {  // catch by reference
  167.         // verify error code
  168.         _ASSERT((int)(e.GetErrCode()) == (int)CException::eInvalid);
  169.         // verify exception class
  170.         _ASSERT(!UppermostCast<CException>(e));
  171.         _ASSERT(!UppermostCast<CSubsystemException>(e));
  172.         _ASSERT(UppermostCast<CSupersystemException>(e));
  173.         // verify error code
  174.         const CSupersystemException *pe = UppermostCast<CSupersystemException>(e);
  175.         _ASSERT(pe->GetErrCode() == CSupersystemException::eSuper2);
  176.         // error code string is always correct
  177.         _ASSERT( strcmp(e.GetErrCodeString(),
  178.                         pe->GetErrCodeString())==0);
  179.         NCBI_RETHROW_SAME(e,"calling f4 from f3");
  180.     }
  181. }
  182. void CExceptApplication::f4(void)
  183. {
  184.     NCBI_THROW(CSupersystemException,eSuper2,"from f4");
  185. }
  186. void CExceptApplication::t1(void)
  187. {
  188.     NCBI_THROW(CErrnoTemplException<CCoreException>,eErrno,"from t1");
  189. }
  190. void CExceptApplication::m1(void)
  191. {
  192.     NCBI_THROW(CErrnoMoreException,eMore2,"from m1");
  193. }
  194. void CExceptApplication::tp1(void)
  195. {
  196.     NCBI_THROW2(CParseTemplException<CCoreException>,eErr,"from tp1",123);
  197. }
  198. //---------------------------------------------------------------------------
  199. int CExceptApplication::Run(void)
  200. {
  201.     try {
  202.         f1();
  203.     }
  204.     catch (CException& e) {
  205. // Attributes
  206.         // verify error code
  207.         _ASSERT(e.GetErrCode() == CException::eInvalid);
  208.         // verify exception class
  209.         _ASSERT(!UppermostCast<CException>(e));
  210.         _ASSERT(UppermostCast<CSubsystemException>(e));
  211.         _ASSERT(!UppermostCast<CSupersystemException>(e));
  212.         // verify error code
  213.         _ASSERT(UppermostCast<CSubsystemException>(e)->GetErrCode() ==
  214.                 CSubsystemException::eType2);
  215.         // verify predecessors
  216.         const CException* pred;
  217.         pred = e.GetPredecessor();
  218.         _ASSERT(pred);
  219.         _ASSERT(pred->GetErrCode() == CException::eInvalid);
  220.         // verify exception class
  221.         _ASSERT(!UppermostCast<CException>(*pred));
  222.         _ASSERT(UppermostCast<CSubsystemException>(*pred));
  223.         _ASSERT(!UppermostCast<CSupersystemException>(*pred));
  224.         // verify error code
  225.         _ASSERT(UppermostCast<CSubsystemException>(*pred)->GetErrCode() ==
  226.                 CSubsystemException::eType2);
  227.         pred = pred->GetPredecessor();
  228.         _ASSERT(pred);
  229.         _ASSERT(pred->GetErrCode() == CException::eInvalid);
  230.         // verify exception class
  231.         _ASSERT(!UppermostCast<CException>(*pred));
  232.         _ASSERT(UppermostCast<CSubsystemException>(*pred));
  233.         _ASSERT(!UppermostCast<CSupersystemException>(*pred));
  234.         // verify error code
  235.         _ASSERT((int)UppermostCast<CSubsystemException>(*pred)->GetErrCode() ==
  236.                 (int)CException::eInvalid);
  237.         pred = pred->GetPredecessor();
  238.         _ASSERT(pred);
  239.         _ASSERT(pred->GetErrCode() == CException::eInvalid);
  240.         // verify exception class
  241.         _ASSERT(!UppermostCast<CException>(*pred));
  242.         _ASSERT(!UppermostCast<CSubsystemException>(*pred));
  243.         _ASSERT(UppermostCast<CSupersystemException>(*pred));
  244.         // verify error code
  245.         _ASSERT(UppermostCast<CSupersystemException>(*pred)->GetErrCode() ==
  246.                 CSupersystemException::eSuper2);
  247. // Reporting
  248.         cerr << endl;
  249.         ERR_POST("****** ERR_POST ******" << e << "err_post ends");
  250.         cerr << endl << "****** e.ReportAll() ******" << endl;
  251.         cerr << e.ReportAll();
  252.         cerr << endl << "****** e.what() ******" << endl;
  253.         cerr << e.what();
  254.         cerr << endl << "****** e.ReportThis() ******" << endl;
  255.         cerr << e.ReportThis() << endl;
  256.         CExceptionReporterStream reporter(cerr);
  257.         CExceptionReporter::SetDefault(&reporter);
  258.         CExceptionReporter::EnableDefault(false);
  259.         cerr << endl;
  260.         e.Report(__FILE__, __LINE__,
  261.             "****** stream reporter ******", &reporter, eDPF_All);
  262.         cerr << endl;
  263.         NCBI_REPORT_EXCEPTION(
  264.             "****** default reporter (stream, disabled) ******",e);
  265.         CExceptionReporter::EnableDefault(true);
  266.         cerr << endl;
  267.         NCBI_REPORT_EXCEPTION(
  268.             "****** default reporter (stream) ******",e);
  269.         CExceptionReporter::SetDefault(0);
  270.         cerr << endl;
  271.         NCBI_REPORT_EXCEPTION(
  272.             "****** default reporter (diag) ******",e);
  273.     }
  274.     catch (exception& /*e*/) {
  275.         _ASSERT(0);
  276.     }
  277.     try {
  278.         t1();
  279.     } catch (CErrnoTemplException<CCoreException>& e) {
  280.         NCBI_REPORT_EXCEPTION("caught as CErrnoTemplException<CCoreException>", e);
  281.         _ASSERT(e.GetErrCode() == CErrnoTemplException<CCoreException>::eErrno);
  282.     } catch (CCoreException& e) {
  283.         NCBI_REPORT_EXCEPTION("caught as CCoreException", e);
  284.         const CErrnoTemplException<CCoreException>* pe = UppermostCast< CErrnoTemplException<CCoreException> > (e);
  285.         _ASSERT(pe->GetErrCode() == CErrnoTemplException<CCoreException>::eErrno);
  286.     } catch (exception&) {
  287.         _ASSERT(0);
  288.     }
  289.     try {
  290.         m1();
  291.     } catch (CErrnoTemplException<CCoreException>& e) {
  292.         NCBI_REPORT_EXCEPTION("caught as CErrnoTemplException<CCoreException>", e);
  293.         _ASSERT((int)e.GetErrCode() == (int)CException::eInvalid);
  294.     } catch (CCoreException e) {
  295.         NCBI_REPORT_EXCEPTION("caught as CCoreException", e);
  296.         _ASSERT((int)e.GetErrCode() == (int)CException::eInvalid);
  297.     } catch (exception&) {
  298.         _ASSERT(0);
  299.     }
  300.     try {
  301.         tp1();
  302.     } catch (CParseTemplException<CCoreException>& e) {
  303.         NCBI_REPORT_EXCEPTION("caught as CParseTemplException<CCoreException>", e);
  304.         _ASSERT(e.GetErrCode() == CParseTemplException<CCoreException>::eErr);
  305.     } catch (exception&) {
  306.         _ASSERT(0);
  307.     }
  308.     cout << "Test completed" << endl;
  309.     return 0;
  310. }
  311. END_NCBI_SCOPE
  312. /////////////////////////////////////////////////////////////////////////////
  313. //  MAIN
  314. USING_NCBI_SCOPE;
  315. int main(int argc, const char* argv[])
  316. {
  317.     // Execute main application function
  318. //    SetDiagPostFlag(eDPF_Trace);
  319.     return CExceptApplication().AppMain(argc, argv, 0, eDS_Default, 0);
  320. }
  321. /*
  322.  * ===========================================================================
  323.  * $Log: test_ncbiexpt.cpp,v $
  324.  * Revision 1000.1  2004/06/01 19:10:10  gouriano
  325.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R6.12
  326.  *
  327.  * Revision 6.12  2004/05/14 13:59:51  gorelenk
  328.  * Added include of ncbi_pch.hpp
  329.  *
  330.  * Revision 6.11  2003/02/24 19:56:51  gouriano
  331.  * use template-based exceptions instead of errno and parse exceptions
  332.  *
  333.  * Revision 6.10  2003/02/14 19:32:49  gouriano
  334.  * added testing of template-based errno and parse exceptions
  335.  *
  336.  * Revision 6.9  2003/01/31 14:51:00  gouriano
  337.  * corrected template-based exception definition
  338.  *
  339.  * Revision 6.8  2002/08/20 19:09:07  gouriano
  340.  * more tests
  341.  *
  342.  * Revision 6.7  2002/07/31 18:34:14  gouriano
  343.  * added test for virtual base class
  344.  *
  345.  * Revision 6.6  2002/07/29 19:30:10  gouriano
  346.  * changes to allow multiple inheritance in CException classes
  347.  *
  348.  * Revision 6.5  2002/07/15 18:17:26  gouriano
  349.  * renamed CNcbiException and its descendents
  350.  *
  351.  * Revision 6.4  2002/07/11 14:18:29  gouriano
  352.  * exceptions replaced by CNcbiException-type ones
  353.  *
  354.  * Revision 6.3  2002/06/27 18:56:16  gouriano
  355.  * added "title" parameter to report functions
  356.  *
  357.  * Revision 6.2  2002/06/27 13:53:40  gouriano
  358.  * added standard NCBI info
  359.  *
  360.  *
  361.  * ===========================================================================
  362.  */