Define an assertThrow() variant that allows providing the default message

This commit is contained in:
Kamil Śliwak 2021-09-23 16:26:10 +02:00 committed by chriseth
parent 529087be6c
commit 1f087ce15c

View File

@ -27,6 +27,8 @@
#include <libsolutil/Exceptions.h> #include <libsolutil/Exceptions.h>
#include <string>
namespace solidity::util namespace solidity::util
{ {
@ -38,16 +40,32 @@ namespace solidity::util
#define ETH_FUNC __func__ #define ETH_FUNC __func__
#endif #endif
/// Assertion that throws an exception containing the given description if it is not met. namespace assertions
/// Use it as assertThrow(1 == 1, ExceptionType, "Mathematics is wrong."); {
/// Do NOT supply an exception object as the second parameter.
#define assertThrow(_condition, _exceptionType, _description) \ inline std::string stringOrDefault(std::string _string, std::string _defaultString)
{
// NOTE: Putting this in a function rather than directly in a macro prevents the string from
// being evaluated multiple times if it's not just a literal.
return (!_string.empty() ? _string : _defaultString);
}
}
/// Base macro that can be used to implement assertion macros.
/// Throws an exception containing the given description if the condition is not met.
/// Allows you to provide the default description for the case where the user of your macro does
/// not provide any.
/// The second parameter must be an exception class (rather than an instance).
#define assertThrowWithDefaultDescription(_condition, _exceptionType, _description, _defaultDescription) \
do \ do \
{ \ { \
if (!(_condition)) \ if (!(_condition)) \
::boost::throw_exception( \ ::boost::throw_exception( \
_exceptionType() << \ _exceptionType() << \
::solidity::util::errinfo_comment(_description) << \ ::solidity::util::errinfo_comment( \
::solidity::util::assertions::stringOrDefault(_description, _defaultDescription) \
) << \
::boost::throw_function(ETH_FUNC) << \ ::boost::throw_function(ETH_FUNC) << \
::boost::throw_file(__FILE__) << \ ::boost::throw_file(__FILE__) << \
::boost::throw_line(__LINE__) \ ::boost::throw_line(__LINE__) \
@ -55,4 +73,10 @@ namespace solidity::util
} \ } \
while (false) while (false)
/// Assertion that throws an exception containing the given description if it is not met.
/// Use it as assertThrow(1 == 1, ExceptionType, "Mathematics is wrong.");
/// The second parameter must be an exception class (rather than an instance).
#define assertThrow(_condition, _exceptionType, _description) \
assertThrowWithDefaultDescription(_condition, _exceptionType, _description, "")
} }