pybind/pybind11

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

Open

#3,336 创建于 2021年10月6日

在 GitHub 查看
 (11 评论) (0 反应) (0 负责人)C++ (14,677 star) (2,005 fork)batch import
bugduplicatehelp wanted

描述

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())

贡献者指南