pybind/pybind11

[BUG]: 'terminate called after throwing an instance of' in `def_buffer` method

Open

#3336 opened on Oct 6, 2021

View on GitHub
 (11 comments) (0 reactions) (0 assignees)C++ (14,677 stars) (2,005 forks)batch import
bugduplicatehelp wanted

Description

Required prerequisites

Problem description

It seems that if I throw an exception from a def_buffer method, this is not translated properly to a Python exception and instead terminates the program with something like:

terminate called after throwing an instance of 'std::invalid_argument'
  what():  unimplemented array format.
Aborted

Reproducible example code

I believe the following minimal repro causes this but I have not yet built it separately/verified outside of my project.

struct Foobar;
py::class_<Foobar>(m, "Foobar")
  .def(py::init<>())
  .def_buffer([](Foobar &) {
    throw std::invalid_argument("boom");
  });
import numpy as np
import my_module
np.array(my_module.Foobar())

Contributor guide