view exceptions.cc @ 329:778c91283a73

Add isequal method to allow comparing pyobjects (fixes issue #53) * @pyobject/pyobject.m: Add an 'isequal' method to fix a BIST test and some more tests.
author Abhinav Tripathi <genuinelucifer@gmail.com>
date Fri, 12 Aug 2016 05:45:06 -0700
parents ef057c4e6aa2
children f777dca58361
line wrap: on
line source

/*

Copyright (C) 2015-2016 Mike Miller
Copyright (C) 2008 David Grundberg, HÃ¥kan Fors Nilsson

This file is part of Pytave.

Pytave is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.

Pytave is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with Pytave; see the file COPYING.  If not, see
<http://www.gnu.org/licenses/>.

*/

#if defined (HAVE_CONFIG_H)
#  include <config.h>
#endif

#include <boost/python.hpp>
#include "exceptions.h"

namespace pytave
{

  PyObject *octave_error_exception::excclass = 0;
  PyObject *value_convert_exception::excclass = 0;
  PyObject *object_convert_exception::excclass = 0;
  PyObject *octave_parse_exception::excclass = 0;
  PyObject *variable_name_exception::excclass = 0;

  bool init_exceptions (void)
  {
    return (octave_error_exception::init ()
            && value_convert_exception::init ()
            && object_convert_exception::init ()
            && octave_parse_exception::init ()
            && variable_name_exception::init ());
  }

  std::string fetch_exception_message (void)
  {
    using namespace boost::python;

    PyObject *ptype, *pvalue, *ptraceback;
    PyErr_Fetch (&ptype, &pvalue, &ptraceback);
    PyErr_NormalizeException (&ptype, &pvalue, &ptraceback);
    std::string message;

    try
      {
        handle<> htype (ptype);
        handle<> hval (allow_null (pvalue));

        object traceback = import ("traceback");
        object format_exception_only = traceback.attr ("format_exception_only");

        object formatted_list = format_exception_only (htype, hval);
        object formatted = str ("").join (formatted_list).strip ();
        message = extract<std::string> (formatted);
      }
    catch (error_already_set const &)
      {
        PyErr_Restore (ptype, pvalue, ptraceback);
        PyErr_Print ();
        message = std::string ("Something weird happened. See traceback above ^");
      }
    return message;
  }
}