00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef _Alembic_Abc_ErrorHandler_h_
00038 #define _Alembic_Abc_ErrorHandler_h_
00039
00040 #include <Alembic/Abc/Foundation.h>
00041
00042 namespace Alembic {
00043 namespace Abc {
00044 namespace ALEMBIC_VERSION_NS {
00045
00046
00047 class ErrorHandler
00048 {
00049 public:
00050 enum Policy
00051 {
00052 kQuietNoopPolicy,
00053 kNoisyNoopPolicy,
00054 kThrowPolicy
00055 };
00056
00057 enum UnknownExceptionFlag
00058 {
00059 kUnknownException
00060 };
00061
00062 ErrorHandler()
00063 : m_policy( kThrowPolicy )
00064 , m_errorLog( "" ) {}
00065
00066 ErrorHandler( Policy iPolicy )
00067 : m_policy( iPolicy )
00068 , m_errorLog( "" ) {}
00069
00070
00071
00072
00073 void operator()( std::exception &iExc,
00074 const std::string &iCtx = "" );
00075
00076 void operator()( const std::string &iErrMsg,
00077 const std::string &iCtx = "" );
00078
00079 void operator()( UnknownExceptionFlag iUef,
00080 const std::string &iCtx = "" );
00081
00082 Policy getPolicy() const { return m_policy; }
00083 void setPolicy( Policy iPolicy ) { m_policy = iPolicy; }
00084
00085 const std::string getErrorLog() const { return m_errorLog; }
00086
00087 bool valid() const { return ( m_errorLog == "" ); }
00088
00089 void clear() { m_errorLog = ""; }
00090
00091 class Context
00092 {
00093 public:
00094 Context( ErrorHandler &iEhnd, const std::string &iCtxMsg )
00095 : m_handler( iEhnd ),
00096 m_message( iCtxMsg ) {}
00097
00098 void operator()( std::exception &iExc )
00099 {
00100 m_handler( iExc, m_message );
00101 }
00102
00103 void operator()( const std::string &iMsg )
00104 {
00105 m_handler( iMsg, m_message );
00106 }
00107
00108 void operator()( UnknownExceptionFlag iUef )
00109 {
00110 m_handler( iUef, m_message );
00111 }
00112
00113 private:
00114 const Context& operator= (const Context&);
00115 ErrorHandler &m_handler;
00116 std::string m_message;
00117 };
00118
00119 private:
00120 void handleIt( const std::string &iErr );
00121
00122 Policy m_policy;
00123 std::string m_errorLog;
00124 };
00125
00126
00127
00128
00129 inline ErrorHandler::Policy
00130 GetErrorHandlerPolicy( AbcA::ArchiveWriterPtr iClass )
00131 { return ErrorHandler::kThrowPolicy; }
00132
00133 inline ErrorHandler::Policy
00134 GetErrorHandlerPolicy( AbcA::ObjectWriterPtr iClass )
00135 { return ErrorHandler::kThrowPolicy; }
00136
00137 inline ErrorHandler::Policy
00138 GetErrorHandlerPolicy( AbcA::CompoundPropertyWriterPtr iClass )
00139 { return ErrorHandler::kThrowPolicy; }
00140
00141 inline ErrorHandler::Policy
00142 GetErrorHandlerPolicy( AbcA::ScalarPropertyWriterPtr iClass )
00143 { return ErrorHandler::kThrowPolicy; }
00144
00145 inline ErrorHandler::Policy
00146 GetErrorHandlerPolicy( AbcA::ArrayPropertyWriterPtr iClass )
00147 { return ErrorHandler::kThrowPolicy; }
00148
00149
00150 inline ErrorHandler::Policy
00151 GetErrorHandlerPolicy( AbcA::ArchiveReaderPtr iClass )
00152 { return ErrorHandler::kThrowPolicy; }
00153
00154 inline ErrorHandler::Policy
00155 GetErrorHandlerPolicy( AbcA::ObjectReaderPtr iClass )
00156 { return ErrorHandler::kThrowPolicy; }
00157
00158 inline ErrorHandler::Policy
00159 GetErrorHandlerPolicy( AbcA::CompoundPropertyReaderPtr iClass )
00160 { return ErrorHandler::kThrowPolicy; }
00161
00162 inline ErrorHandler::Policy
00163 GetErrorHandlerPolicy( AbcA::ScalarPropertyReaderPtr iClass )
00164 { return ErrorHandler::kThrowPolicy; }
00165
00166 inline ErrorHandler::Policy
00167 GetErrorHandlerPolicy( AbcA::ArrayPropertyReaderPtr iClass )
00168 { return ErrorHandler::kThrowPolicy; }
00169
00170
00171 #define ALEMBIC_ABC_SAFE_CALL_BEGIN( CONTEXT ) \
00172 do \
00173 { \
00174 ::Alembic::Abc::ErrorHandler::Context \
00175 __err( this->getErrorHandler(), ( CONTEXT ) ); \
00176 try \
00177 {
00178
00179
00180 #define ALEMBIC_ABC_SAFE_CALL_END_RESET() \
00181 } \
00182 catch ( std::exception &exc ) \
00183 { \
00184 this->reset(); \
00185 __err( exc ); \
00186 } \
00187 catch ( ... ) \
00188 { \
00189 this->reset(); \
00190 __err( ::Alembic::Abc:: \
00191 ErrorHandler::kUnknownException ); \
00192 } \
00193 } \
00194 while( 0 )
00195
00196
00197 #define ALEMBIC_ABC_SAFE_CALL_END() \
00198 } \
00199 catch ( std::exception &exc ) \
00200 { \
00201 __err( exc ); \
00202 } \
00203 catch ( ... ) \
00204 { \
00205 __err( ::Alembic::Abc:: \
00206 ErrorHandler::kUnknownException ); \
00207 } \
00208 } \
00209 while( 0 )
00210
00211 }
00212
00213 using namespace ALEMBIC_VERSION_NS;
00214
00215 }
00216 }
00217
00218 #endif