-#define RETHROW0(msg) _XBT_PRE_RETHROW msg, _XBT_POST_RETHROW
-#define RETHROW1(msg,a) _XBT_PRE_RETHROW msg,a, _XBT_POST_RETHROW
-#define RETHROW2(msg,a,b) _XBT_PRE_RETHROW msg,a,b, _XBT_POST_RETHROW
-#define RETHROW3(msg,a,b,c) _XBT_PRE_RETHROW msg,a,b,c, _XBT_POST_RETHROW
-#define RETHROW4(msg,a,b,c,d) _XBT_PRE_RETHROW msg,a,b,c, _XBT_POST_RETHROW
-#define RETHROW5(msg,a,b,c,d,e) _XBT_PRE_RETHROW msg,a,b,c,d,e _XBT_POST_RETHROW
+/** @brief Exception destructor */
+XBT_PUBLIC(void) xbt_ex_free(xbt_ex_t e);
+
+/** @brief Shows a backtrace of the current location */
+XBT_PUBLIC(void) xbt_backtrace_display_current(void);
+/** @brief reimplementation of glibc backtrace based directly on gcc library, without implicit malloc */
+XBT_PUBLIC(int) xbt_backtrace_no_malloc(void**bt, int size);
+/** @brief Captures a backtrace for further use */
+XBT_PUBLIC(void) xbt_backtrace_current(xbt_ex_t * e);
+/** @brief Display a previously captured backtrace */
+XBT_PUBLIC(void) xbt_backtrace_display(xbt_ex_t * e);
+/** @brief Get current backtrace with libunwind */
+XBT_PUBLIC(int) xbt_libunwind_backtrace(void *bt[XBT_BACKTRACE_SIZE], int size);
+
+#ifdef XBT_USE_DEPRECATED
+
+/* Kept for backward compatibility. */
+
+#define THROW0(c, v, m) \
+ do { if (m) THROWF(c, v, m); else THROW(c, v); } while (0)
+#define THROW1(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW2(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW3(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW4(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW5(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW6(c, v, ...) THROWF(c, v, __VA_ARGS__)
+#define THROW7(c, v, ...) THROWF(c, v, __VA_ARGS__)
+
+#define RETHROW0(...) RETHROWF(__VA_ARGS__)
+#define RETHROW1(...) RETHROWF(__VA_ARGS__)
+#define RETHROW2(...) RETHROWF(__VA_ARGS__)
+#define RETHROW3(...) RETHROWF(__VA_ARGS__)
+#define RETHROW4(...) RETHROWF(__VA_ARGS__)
+#define RETHROW5(...) RETHROWF(__VA_ARGS__)