view exceptions.cc @ 420:7864849e84c2

Eliminate some compiler warnings * Makefile.am (AM_CXXFLAGS): Build with -W -Wall by default. * __py_struct_from_dict__.cc (F__py_int64_scalar_value__, F__py_uint64_scalar_value__, F__py_is_none__, F__py_isinstance__, F__py_objstore_del__, F__py_objstore_get__, F__py_objstore_put__, F__py_string_value__, F__py_struct_from_dict__): Remove unused parameter to eliminate -Wunused-parameter warning. * pyexec.cc (Fpyexec): Likewise. * oct-py-init.cc (pytave::py_init): Declare argv array correctly to eliminate -Wwrite-strings warning. * oct-py-types.cc (pytave::make_py_bool): Explicitly increment and return value to eliminate -Wstrict-aliasing warning. (pytave::make_py_complex, pytave::extract_py_complex): Copy complex values between C++ and Python types to eliminate -Wstrict-aliasing warning. (pytave::extract_py_int64): Add braces to nested if block to eliminate -Wparentheses warning.
author Mike Miller <mtmiller@octave.org>
date Thu, 04 May 2017 12:31:07 -0700
parents aef165ff92b0
children
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 "exceptions.h"
#include "oct-py-eval.h"
#include "oct-py-object.h"
#include "oct-py-types.h"

namespace pytave
{
  std::string fetch_exception_message (void)
  {
    PyObject *ptype, *pvalue, *ptraceback;
    PyErr_Fetch (&ptype, &pvalue, &ptraceback);
    PyErr_NormalizeException (&ptype, &pvalue, &ptraceback);

    python_object args = PyTuple_Pack (2, ptype, pvalue);
    python_object formatted_list = py_call_function
                                   ("traceback.format_exception_only", args);

    std::string message;

    if (formatted_list && PyList_Check (formatted_list))
      {
        int len = PyList_Size (formatted_list);

        for (int i = 0; i < len; i++)
          message.append (extract_py_str (PyList_GetItem (formatted_list, i)));
      }
    else
      {
        PyErr_Restore (ptype, pvalue, ptraceback);
        PyErr_Print ();
        message = "exceptions.cc (pytave::fetch_exception_message): cannot call 'format_exceptions_only' for the traceback";
      }

    return message;
  }
}