1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#include <Python.h>
#include <ios>
#include <new>
#include <stdexcept>
int raise_int(int fire) {
if (fire) {
throw 1;
}
return 0;
}
int raise_index(int fire) {
if (fire) {
throw std::out_of_range("c++ error");
}
return 0;
}
class Foo {
public:
int bar(int fire) {
if (fire) {
throw 1;
}
return 0;
}
};
void raise_domain_error() {
throw std::domain_error("domain_error");
}
void raise_ios_failure() {
throw std::ios_base::failure("iostream failure");
}
void raise_memory() {
// std::bad_alloc can only be default constructed,
// so we have no control over the error message
throw std::bad_alloc();
}
void raise_overflow() {
throw std::overflow_error("overflow_error");
}
void raise_range_error() {
throw std::range_error("range_error");
}
struct Base { virtual ~Base() {} };
struct Derived : Base { void use() const { abort(); } };
void raise_typeerror() {
Base foo;
Base &bar = foo; // prevents "dynamic_cast can never succeed" warning
Derived &baz = dynamic_cast<Derived &>(bar);
baz.use(); // not reached; prevents "unused variable" warning
}
void raise_underflow() {
throw std::underflow_error("underflow_error");
}
PyObject *raise_or_throw(int py) {
if (!py) {
throw std::runtime_error("oopsie");
}
PyErr_SetString(PyExc_ValueError, "oopsie");
return NULL;
}
int raise_or_throw_int(int py) {
if (!py) {
throw std::runtime_error("oopsie");
}
PyErr_SetString(PyExc_ValueError, "oopsie");
return -1;
}
|