[C++-sig] Re: "unidentifiable C++ exception"

Nicholas Gildea nick.gildea at gmail.com
Sat Sep 18 15:26:12 CEST 2004


Thanks for the quick responce David. You were right about the python
library, I've now get the code working. After trying (and failing) to
build python 2.3.3 myself I discovered the 2.4 release is built with
VC7.1 and so updating to that version has solved the problem.

Thanks again, 
Nick.


On Sat, 18 Sep 2004 07:09:23 -0400, David Abrahams
<dave at boost-consulting.com> wrote:
> Nicholas Gildea <nick.gildea at gmail.com> writes:
> 
> > First, sorry if this is a little off-topic, but I wasn't sure where else to ask.
> >
> > I've started (trying) to use Boost.Python to embed Python in a C++
> > application. After managing to successfully get the "Hello World"
> > style example working, I've run into a problem. When I started to use
> > PyRun_File instead of PyRun_String, I first got an access violation
> > and then after some Googling saw a suggestion to use the Boost.Python
> > exception handling wrappers to try and solve the problem, which
> > generates the "unidentifiable C++ exception" error.
> 
> The access violation is the real problem.  Stick the following  in
> your file and the EH stuff will stop interfering with it.
> 
>   # include <windows.h>
>   #  pragma warning(push)
>   #  pragma warning(disable:4297)
>   extern "C" void straight_to_debugger(unsigned int, EXCEPTION_POINTERS*)
>   {
>       throw;
>   }
>   extern "C" void (*old_translator)(unsigned, EXCEPTION_POINTERS*)
>            = _set_se_translator(straight_to_debugger);
>   #  pragma warning(pop)
> 
> > My code looks like the following:
> >
> > #include <boost/python.hpp>
> > #include <stdio.h>
> > #include <iostream>
> >
> > #pragma comment( lib, "python23.lib" )
> > #pragma comment( lib, "boost_python.lib" )
> >
> > using namespace boost::python;
> >
> > void test()
> > {
> >       handle<> mainModule( borrowed( PyImport_AddModule( "__main__" ) ) );
> >       handle<> mainNamespace( borrowed( PyModule_GetDict( mainModule.get() ) ) );
> >
> >       const char* const path = "test.py";
> >
> >       FILE* f = fopen( path, "r" );
> >       if( f == NULL )
> >       {
> >               std::cout << "[c++] Couldn't open file!\n";
> >               return;
> >       }
> >
> >       handle<>( PyRun_File( f, path, Py_file_input, mainNamespace.get(),
> > mainNamespace.get() ) );
> >
> >       fclose( f );
> > }
> >
> > int main( int argc, char** argv )
> > {
> >       Py_Initialize();
> >
> >       if( handle_exception( test ) )
> >       {
> >               if( PyErr_Occurred() )
> >               {
> >                       PyErr_Print();
> >               }
> >
> >               return 1;
> >       }
> >
> >       return 0;
> > }
> >
> > with test.py consisting of just a print statement. I'm compiling this
> > using VC7.1, and using the library supplied with Python 2.3.3 and have
> > built boost_python.lib from boost version 1.31 (also in VC7.1).
> 
> The problem is almost certainly that the Python23.lib you're using was
> built with a different version of VC, which had a different layout for
> the FILE structure.  The solution is to rebuild it from source.
> 
> HTH,
> 
> --
> Dave Abrahams
> Boost Consulting
> http://www.boost-consulting.com
> 
> _______________________________________________
> C++-sig mailing list
> C++-sig at python.org
> http://mail.python.org/mailman/listinfo/c++-sig
>



More information about the Cplusplus-sig mailing list