+ /** Allow to carry a value (used by testany/waitany) */
+ ssize_t get_value() const { return value_; }
+ void set_value(ssize_t value) { value_ = value; }
+
+ std::string resolve_backtrace() const { return throwpoint_.backtrace_.resolve(); }
+
+ virtual void rethrow_nested(simgrid::xbt::ThrowPoint&& throwpoint, const std::string& message) const
+ {
+ std::throw_with_nested(Exception(std::move(throwpoint), message));
+ }
+
+private:
+ xbt::ThrowPoint throwpoint_;
+ ssize_t value_ = 0;
+};
+
+#define DECLARE_SIMGRID_EXCEPTION(AnyException, ...) \
+ class AnyException : public Exception { \
+ public: \
+ using Exception::Exception; \
+ __VA_ARGS__ \
+ ~AnyException() override; \
+ void rethrow_nested(simgrid::xbt::ThrowPoint&& throwpoint, const std::string& message) const override \
+ { \
+ std::throw_with_nested(AnyException(std::move(throwpoint), message)); \
+ } \
+ }
+
+/** Exception raised when a timeout elapsed */
+DECLARE_SIMGRID_EXCEPTION(TimeoutException);
+
+/** Exception raised when a host fails */
+DECLARE_SIMGRID_EXCEPTION(HostFailureException);
+
+/** Exception raised when a communication fails because of the network or because of the remote host */
+DECLARE_SIMGRID_EXCEPTION(NetworkFailureException);
+
+/** Exception raised when a storage fails */
+DECLARE_SIMGRID_EXCEPTION(StorageFailureException);
+
+/** Exception raised when a VM fails */
+DECLARE_SIMGRID_EXCEPTION(VmFailureException);
+
+/** Exception raised when something got canceled before completion */
+DECLARE_SIMGRID_EXCEPTION(CancelException);
+
+/** Exception raised when something is going wrong during the simulation tracing */
+DECLARE_SIMGRID_EXCEPTION(TracingError);
+
+/** Exception raised when something is going wrong during the parsing of XML files */
+#define PARSE_ERROR_CONSTRUCTOR \
+ ParseError(const std::string& file, int line, const std::string& msg) \
+ : Exception(XBT_THROW_POINT, xbt::string_printf("Parse error at %s:%d: %s", file.c_str(), line, msg.c_str())) \
+ { \
+ }
+
+DECLARE_SIMGRID_EXCEPTION(ParseError, PARSE_ERROR_CONSTRUCTOR);
+#undef PARSE_ERROR_CONSTRUCTOR
+
+#undef DECLARE_SIMGRID_EXCEPTION
+
+class XBT_PUBLIC ForcefulKillException {
+ /** @brief Exception launched to kill an actor; DO NOT BLOCK IT!