diff options
author | Arne Juul <arnej@verizonmedia.com> | 2021-03-18 09:43:35 +0000 |
---|---|---|
committer | Arne Juul <arnej@verizonmedia.com> | 2021-03-19 14:52:27 +0000 |
commit | fbfa39b37565f4d2446a766976759e5317914641 (patch) | |
tree | a58ee7b5229929797aff819f385f9b489cac8080 /vespalib | |
parent | a1b489dec69b08017e3b30913f34e51ff262abd6 (diff) |
use new vespalib::RequireFailure exception
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/tests/require/require_test.cpp | 37 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/util/require.cpp | 16 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/util/require.h | 25 |
3 files changed, 44 insertions, 34 deletions
diff --git a/vespalib/src/tests/require/require_test.cpp b/vespalib/src/tests/require/require_test.cpp index d1060cfe474..10efd84e252 100644 --- a/vespalib/src/tests/require/require_test.cpp +++ b/vespalib/src/tests/require/require_test.cpp @@ -2,7 +2,6 @@ #include <vespa/vespalib/util/require.h> #include <vespa/vespalib/gtest/gtest.h> -#include <stdexcept> //----------------------------------------------------------------------------- @@ -39,27 +38,31 @@ void fail_require_eq() { } TEST(RequireTest, require_can_fail) { - using E = std::invalid_argument; + using E = vespalib::RequireFailure; EXPECT_THROW( - { - try { fail_require(); } - catch(const E &e) { - fprintf(stderr, "e.what() is >>>%s<<<\n", e.what()); - throw; - } - }, E); + { + try { fail_require(); } + catch(const E &e) { + fprintf(stderr, "e.getMessage() is >>>%s<<<\n", e.getMessage().c_str()); + fprintf(stderr, "e.getLocation() is >>>%s<<<\n", e.getLocation().c_str()); + fprintf(stderr, "e.what() is >>>%s<<<\n", e.what()); + throw; + } + }, E); } TEST(RequireTest, require_eq_can_fail) { - using E = std::invalid_argument; + using E = vespalib::RequireFailure; EXPECT_THROW( - { - try { fail_require_eq(); } - catch(const E &e) { - fprintf(stderr, "e.what() is >>>%s<<<\n", e.what()); - throw; - } - }, E); + { + try { fail_require_eq(); } + catch(const E &e) { + fprintf(stderr, "e.getMessage() is >>>%s<<<\n", e.getMessage().c_str()); + fprintf(stderr, "e.getLocation() is >>>%s<<<\n", e.getLocation().c_str()); + fprintf(stderr, "e.what() is >>>%s<<<\n", e.what()); + throw; + } + }, E); } //----------------------------------------------------------------------------- diff --git a/vespalib/src/vespa/vespalib/util/require.cpp b/vespalib/src/vespa/vespalib/util/require.cpp index c00683c018e..afccea63c84 100644 --- a/vespalib/src/vespa/vespalib/util/require.cpp +++ b/vespalib/src/vespa/vespalib/util/require.cpp @@ -3,18 +3,20 @@ #include "require.h" #include <vespa/vespalib/stllike/asciistream.h> #include <iostream> -#include <stdexcept> namespace vespalib { +VESPA_IMPLEMENT_EXCEPTION(RequireFailure, Exception); + void handle_require_failure(const char *description, const char *file, uint32_t line) { - asciistream msg; - msg << "in " << file; - msg << " line " << line; - msg << " requirement (" << description << ") fails"; - std::cerr << msg.c_str() << "\n"; - throw std::invalid_argument(msg.c_str()); + asciistream msg; + msg << file << ":" << line << ": "; + msg << "error: (" << description << ") fails"; + std::cerr << msg.c_str() << "\n"; + asciistream loc; + loc << "file " << file << " line " << line; + throw RequireFailure(msg.c_str(), loc.c_str(), 2); } } // namespace diff --git a/vespalib/src/vespa/vespalib/util/require.h b/vespalib/src/vespa/vespalib/util/require.h index 9de58142926..ef94d507051 100644 --- a/vespalib/src/vespa/vespalib/util/require.h +++ b/vespalib/src/vespa/vespalib/util/require.h @@ -3,31 +3,36 @@ #pragma once #include <iostream> +#include <vespa/vespalib/util/exception.h> namespace vespalib { +VESPA_DEFINE_EXCEPTION(RequireFailure, Exception); + constexpr void handle_require_success() {} + void handle_require_failure [[noreturn]] (const char *description, const char *file, uint32_t line); + template<typename A, typename B> void handle_require_eq_failure [[noreturn]] (const A& a, const B& b, const char *description, const char *file, uint32_t line) { - std::cerr << "( " << a << " == " << b << " ) is false\n"; - handle_require_failure(description, file, line); + std::cerr << "( " << a << " == " << b << " ) is false\n"; + handle_require_failure(description, file, line); } #ifndef __STRING #define __STRING(x) #x #endif -#define REQUIRE(...) \ - (__VA_ARGS__) ? vespalib::handle_require_success() : \ - vespalib::handle_require_failure(__STRING(__VA_ARGS__), \ - __FILE__, __LINE__) +#define REQUIRE(...) \ + (__VA_ARGS__) ? vespalib::handle_require_success() : \ + vespalib::handle_require_failure(__STRING(__VA_ARGS__), \ + __FILE__, __LINE__) -#define REQUIRE_EQ(a, b) \ - (a == b) ? vespalib::handle_require_success() : \ - vespalib::handle_require_eq_failure(a, b, __STRING(a) " == " __STRING(b), \ - __FILE__, __LINE__) +#define REQUIRE_EQ(a, b) \ + (a == b) ? vespalib::handle_require_success() : \ + vespalib::handle_require_eq_failure(a, b, __STRING(a) " == " __STRING(b), \ + __FILE__, __LINE__) } // namespace |