Skip to content

Commit

Permalink
Add formatter for std::exception
Browse files Browse the repository at this point in the history
Co-authored-by: fekir <federico.kircheis@gmail.com>
Co-authored-by: Alexey Ochapov <alexez@alexez.com>
  • Loading branch information
3 people committed Aug 31, 2022
1 parent a337011 commit 2821d2c
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 2 deletions.
18 changes: 17 additions & 1 deletion include/fmt/std.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#ifndef FMT_STD_H_
#define FMT_STD_H_

#include <exception>
#include <thread>
#include <type_traits>
#include <utility>
Expand Down Expand Up @@ -166,6 +167,21 @@ struct formatter<
}
};
FMT_END_NAMESPACE
#endif

#endif // __cpp_lib_variant

FMT_BEGIN_NAMESPACE
template <typename T, typename Char>
struct formatter<
T, Char,
typename std::enable_if<std::is_base_of<std::exception, T>::value>::type>
: formatter<string_view> {
template <typename FormatContext>
auto format(const std::exception& ex, FormatContext& ctx) const ->
typename FormatContext::iterator {
return fmt::formatter<string_view>::format(ex.what(), ctx);
}
};
FMT_END_NAMESPACE

#endif // FMT_STD_H_
33 changes: 32 additions & 1 deletion test/std-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
// For the license information refer to format.h.

#include "fmt/std.h"
#include "fmt/ranges.h"

#include <string>
#include <vector>

#include "fmt/ranges.h"
#include "gtest/gtest.h"

TEST(std_test, path) {
Expand Down Expand Up @@ -77,3 +77,34 @@ TEST(std_test, variant) {
EXPECT_EQ(fmt::format("{}", v5), "variant(\"yes, this is variant\")");
#endif
}

TEST(std_test, exception) {
#if defined(_MSC_VER)
# if _MSC_VER > 1920
std::string str("invalid vector subscript");
# else
std::string str("invalid vector<T> subscript");
# endif
#elif not defined(NDEBUG) && (defined(__clang__) || defined(__GNUC__)) || defined (__APPLE__)
std::string str("vector::_M_range_check: __n (which is 42) >= this->size() (which is 0)");
#else
std::string str("vector");
#endif
std::string escstr = fmt::format("\"{}\"", str);

try {
std::vector<int> vec;
std::ignore = vec.at(42);
} catch (const std::exception& ex) {
EXPECT_EQ(fmt::format("{}", ex), str);
EXPECT_EQ(fmt::format("{:?}", ex), escstr);
}

try {
std::vector<int> vec;
std::ignore = vec.at(42);
} catch (const std::out_of_range& ex) {
EXPECT_EQ(fmt::format("{}", ex), str);
EXPECT_EQ(fmt::format("{:?}", ex), escstr);
}
}

0 comments on commit 2821d2c

Please sign in to comment.