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 b5c02fc
Show file tree
Hide file tree
Showing 2 changed files with 47 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_
31 changes: 30 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,32 @@ TEST(std_test, variant) {
EXPECT_EQ(fmt::format("{}", v5), "variant(\"yes, this is variant\")");
#endif
}

TEST(std_test, exception) {
#if (defined(__GNUC__) && __GNUC__ <= 8 ) || (defined(__clang__) && __clang__ <= 8) || defined(_APPLE__)
std::string str("vector");
#elif defined(__clang__) || defined(__GNUC__)
std::string str("vector::_M_range_check: __n (which is 42) >= this->size() (which is 0)");
#elif defined(_MSC_VER) && _MSC_VER > 1920
std::string str("invalid vector subscript");
#else
std::string str("invalid vector<T> subscript");
#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 b5c02fc

Please sign in to comment.