summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2021-03-18 09:43:35 +0000
committerArne Juul <arnej@verizonmedia.com>2021-03-19 14:52:27 +0000
commitfbfa39b37565f4d2446a766976759e5317914641 (patch)
treea58ee7b5229929797aff819f385f9b489cac8080 /vespalib
parenta1b489dec69b08017e3b30913f34e51ff262abd6 (diff)
use new vespalib::RequireFailure exception
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/tests/require/require_test.cpp37
-rw-r--r--vespalib/src/vespa/vespalib/util/require.cpp16
-rw-r--r--vespalib/src/vespa/vespalib/util/require.h25
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