NS_FATAL_ERROR_CONT macro, to report an error message, but allow the caller to terminate later.
--- a/src/core/model/fatal-error.h Wed Aug 12 16:37:08 2015 -0700
+++ b/src/core/model/fatal-error.h Thu Aug 13 15:11:25 2015 -0700
@@ -52,57 +52,113 @@
* on the attempt to execute the flush() function.
*/
+/**
+ * \ingroup fatal
+ *
+ * \brief Fatal error reporting implementation.
+ *
+ * When this macro is hit at runtime the error details will
+ * printed to \c stderr, including the supplied \c msg,
+ * and the file name and line number. Optionally, if \c fatal is true,
+ * the macro will invoke \c std::terminate(). If \c fatal is false,
+ * the invoking function should return an error code to its caller,
+ * which is expected to call NS_FATAL_ERROR to cause termination.
+ *
+ * \param [in] msg The error message to print, if not empty.
+ * \param [in] fatal Call \c std::terminate() if true.
+ *
+ * This macro is enabled unconditionally in all builds,
+ * including debug and optimized builds.
+ */
+#define NS_FATAL_ERROR_IMPL_NO_MSG(fatal) \
+ do \
+ { \
+ std::cerr << "file=" << __FILE__ << ", line=" << \
+ __LINE__ << std::endl; \
+ ::ns3::FatalImpl::FlushStreams (); \
+ if (fatal) std::terminate (); \
+ } \
+ while (false)
+
+
+#define NS_FATAL_ERROR_IMPL(msg,fatal) \
+ do \
+ { \
+ std::cerr << "msg=\"" << msg << "\", "; \
+ NS_FATAL_ERROR_IMPL_NO_MSG (fatal); \
+ } \
+ while (false)
+
/**
* \ingroup fatal
*
- * \brief Fatal error handling
+ * \brief Report a fatal error and terminate.
*
* When this macro is hit at runtime, details of filename
- * and line number is printed to stderr, and the program
- * is halted by calling std::terminate(). This will
+ * and line number are printed to \c stderr, and the program
+ * is halted by calling \c std::terminate(). This will
* trigger any clean up code registered by
- * std::set_terminate (NS3 default is a stream-flushing
+ * \c std::set_terminate (NS3 default is a stream-flushing
* code), but may be overridden.
*
* This macro is enabled unconditionally in all builds,
* including debug and optimized builds.
*/
-#define NS_FATAL_ERROR_NO_MSG() \
- do \
- { \
- std::cerr << "file=" << __FILE__ << ", line=" << \
- __LINE__ << std::endl; \
- ::ns3::FatalImpl::FlushStreams (); \
- std::terminate (); \
- } \
- while (false)
+#define NS_FATAL_ERROR_NO_MSG() NS_FATAL_ERROR_IMPL_NO_MSG (true)
/**
* \ingroup fatal
*
- * \brief Fatal error handling
+ * \brief Report a fatal error, deferring termination.
+ *
+ * When this macro is hit at runtime, details of filename
+ * and line number are printed to \c stderr, however the program
+ * is _not_ halted. It is expected that the function using this
+ * macro will return an error code, and its caller will
+ * invoke NS_FATAL_ERROR(msg) triggering std::terminate().
+ *
+ * This macro is enabled unconditionally in all builds,
+ * including debug and optimized builds.
+ */
+#define NS_FATAL_ERROR_NO_MSG_CONT() NS_FATAL_ERROR_IMPL_NO_MSG (false)
+
+/**
+ * \ingroup fatal
+ *
+ * \brief Report a fatal error with a message and terminate.
*
* \param [in] msg message to output when this macro is hit.
*
* When this macro is hit at runtime, the user-specified
- * error message is printed to stderr, followed by a call
+ * error message are printed to \c stderr, followed by a call
* to the NS_FATAL_ERROR_NO_MSG() macro which prints the
- * details of filename and line number to stderr. The
- * program will be halted by calling std::terminate(),
+ * details of filename and line number to \c stderr. The
+ * program will be halted by calling \c std::terminate(),
* triggering any clean up code registered by
- * std::set_terminate (NS3 default is a stream-flushing
+ * \c std::set_terminate (NS3 default is a stream-flushing
* code, but may be overridden).
*
* This macro is enabled unconditionally in all builds,
* including debug and optimized builds.
*/
-#define NS_FATAL_ERROR(msg) \
- do \
- { \
- std::cerr << "msg=\"" << msg << "\", "; \
- NS_FATAL_ERROR_NO_MSG (); \
- } \
- while (false)
+#define NS_FATAL_ERROR(msg) NS_FATAL_ERROR_IMPL (msg, true)
+
+/**
+ * \ingroup fatal
+ *
+ * \brief Report a fatal error with a message, deferring termination.
+ *
+ * When this macro is hit at runtime, details of filename
+ * and line number are printed to \c stderr, however the program
+ * is _not_ halted. It is expected that the function using this
+ * macro will return an error code, and its caller will
+ * invoke NS_FATAL_ERROR(msg) triggering \c std::terminate().
+ *
+ * This macro is enabled unconditionally in all builds,
+ * including debug and optimized builds.
+ */
+#define NS_FATAL_ERROR_CONT(msg) NS_FATAL_ERROR_IMPL (msg, false)
+
#endif /* FATAL_ERROR_H */