#include #include "cpp11/doubles.hpp" #include "cpp11/protect.hpp" [[cpp11::register]] SEXP cpp11_safe_(SEXP x_sxp) { SEXP err = R_NilValue; const size_t ERROR_SIZE = 2048; char buf[ERROR_SIZE] = ""; try { const cpp11::doubles x(x_sxp); // Rf_error("R error"); // This will not call dtors // throw std::runtime_error("C++ error"); // cpp11::unwind_protect([&]() { Rf_error("R error"); }); SEXP out = cpp11::unwind_protect([&] { return Rf_allocVector(REALSXP, 1); }); return out; } catch (cpp11::unwind_exception& e) { err = e.token; } catch (std::exception& e) { strncpy(buf, e.what(), ERROR_SIZE - 1); } if (buf[0] != '\0') { Rf_error("%s", buf); } else if (err != R_NilValue) { R_ContinueUnwind(err); } return R_NilValue; }