I've been trying to understand the use of CHKERRXX() PetscErrorCxx(), 
PetscTraceBackErrorHandlerCxx() and think it is messed up.

   Assumptions 
1) real PETSc c++ code (that is PETSc code that uses C++ constructs, has .cxx 
extensions) can call PETSc c code (the normal old PETSc source) 
2) PETSc c code cannot call PETSc c++ code
3) PETSc c++ code uses C++ exceptions for error handling, NOT return values.
are these correct?

   Thus when PETSc c++ code calls PETSc c code it needs to translate any PETSc 
error return codes to C++ exceptions.  This is currently done by CHKERRXX() 
being a macro to PetscErrorCxx() that then calls 
PetscTraceBackErrorHandlerCxx() that actually generates the exception.  But 
PetscErrorCxx() is not really the same thing as calling PetscError and 
PetscTraceBackErrorHandlerCxx() is not really a C++ version of 
PetscTraceBackErrorHandler(). Plus PetscTraceBackErrorHandlerCxx() is not an 
error handler because it cannot be set with PetscPushErrorHandler().

   I have started to reorganize this. 

 Turned PetscTraceBackErrorHandlerCxx() into a regular handler that can be 
pushed. Put the stream it uses into the handler context. 
Removed PetscErrorCxx()
Added to PetscError() to automatically generate an exception if the caller is a 
C++ routine; as indicated by the PetscErrorType flag that is passed in.
Changed CHKERRXX() to simply call PetscError() with the appropriate 
PetscErrorType of PETSC_ERROR_IN_CXX
Not yet tested the PetscTraceBackErrorHandlerCxx() 

   Barry


Reply via email to