diff --git a/src/c_api/c_api_error.h b/src/c_api/c_api_error.h index 612c89cbf..9e8d58c48 100644 --- a/src/c_api/c_api_error.h +++ b/src/c_api/c_api_error.h @@ -16,9 +16,17 @@ #else // LOG_CAPI_INVOCATION #define API_BEGIN() try { #endif // LOG_CAPI_INVOCATION + /*! \brief every function starts with API_BEGIN(); and finishes with API_END() or API_END_HANDLE_ERROR */ -#define API_END() } catch(dmlc::Error &_except_) { return XGBAPIHandleException(_except_); } return 0; // NOLINT(*) +#define API_END() \ + } catch (dmlc::Error & _except_) { \ + return XGBAPIHandleException(_except_); \ + } catch (std::exception const &_except_) { \ + return XGBAPIHandleException(dmlc::Error(_except_.what())); \ + } \ + return 0; // NOLINT(*) + #define CHECK_HANDLE() if (handle == nullptr) \ LOG(FATAL) << "DMatrix/Booster has not been intialized or has already been disposed."; /*! diff --git a/tests/cpp/c_api/test_c_api.cc b/tests/cpp/c_api/test_c_api.cc index 664118780..b5d6b6b5a 100644 --- a/tests/cpp/c_api/test_c_api.cc +++ b/tests/cpp/c_api/test_c_api.cc @@ -10,6 +10,8 @@ #include "../helpers.h" #include "../../../src/common/io.h" +#include "../../../src/c_api/c_api_error.h" + TEST(CAPI, XGDMatrixCreateFromMatDT) { std::vector col0 = {0, -1, 3}; std::vector col1 = {-4.0f, 2.0f, 0.0f}; @@ -196,4 +198,18 @@ TEST(CAPI, DMatrixSetFeatureName) { XGDMatrixFree(handle); } + +int TestExceptionCatching() { + API_BEGIN(); + throw std::bad_alloc(); + API_END(); +} + +TEST(CAPI, Exception) { + ASSERT_NO_THROW({TestExceptionCatching();}); + ASSERT_EQ(TestExceptionCatching(), -1); + auto error = XGBGetLastError(); + // Not null + ASSERT_TRUE(error); +} } // namespace xgboost