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 <string>
namespace solidity::util
{
@ -38,16 +40,32 @@ namespace solidity::util
#define ETH_FUNC __func__
#endif
/// Assertion that throws an exception containing the given description if it is not met.
/// 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) \
namespace assertions
{
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 \
{ \
if (!(_condition)) \
::boost::throw_exception( \
_exceptionType() << \
::solidity::util::errinfo_comment(_description) << \
::solidity::util::errinfo_comment( \
::solidity::util::assertions::stringOrDefault(_description, _defaultDescription) \
) << \
::boost::throw_function(ETH_FUNC) << \
::boost::throw_file(__FILE__) << \
::boost::throw_line(__LINE__) \
@ -55,4 +73,10 @@ namespace solidity::util
} \
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, "")
}