From: Eric Niebler Date: Thu, 29 Dec 2016 19:51:18 +0000 (-0800) Subject: folly::TryException inherits from std::logic_error, like std::bad_optional_access... X-Git-Tag: v2017.03.06.00~151 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=06649f434861ba1a287df67ce28486879a5cddc6;p=folly.git folly::TryException inherits from std::logic_error, like std::bad_optional_access; becomes no-throw copyable Summary: folly::TryException was inheriting from std::exception and managing its own message in a std::string data member. That is suboptimal for the following reasons: 1) The analagous std:: type, std::bad_optional_access, inherits from std::logic_error. According to the Principle of Least Astonishment, folly::TryException should follow suit. 2) std::logic_error has a nothrow copy constructor. (This is typically implemented with a ref-counted string.) std::string does not. By explicitly managing its own message, folly::TryException picks up a throwing copy constructor. Exception classes should try to be nothrow copyable. 3) With most stdlib implementations, std::string is larger by a lot than the std:: exceptions. By changing folly::TryException as suggested, its size drops from 40 bytes to 16 on clang and gcc >=5.0. Reviewed By: yfeldblum Differential Revision: D4368760 fbshipit-source-id: 327f78f428419ccf9c7af3e0f57cc478d147fb37 --- diff --git a/folly/Try.h b/folly/Try.h index e6b6ebad..1f08e27e 100644 --- a/folly/Try.h +++ b/folly/Try.h @@ -16,41 +16,26 @@ #pragma once -#include -#include -#include #include #include #include #include #include +#include +#include +#include +#include namespace folly { -class TryException : public std::exception { +class TryException : public std::logic_error { public: - explicit TryException(std::string message_arg) noexcept - : message(std::move(message_arg)) {} - - const char* what() const noexcept override { - return message.c_str(); - } - - bool operator==(const TryException& other) const noexcept { - return other.message == this->message; - } - - bool operator!=(const TryException& other) const noexcept { - return !(*this == other); - } - - protected: - std::string message; + using std::logic_error::logic_error; }; class UsingUninitializedTry : public TryException { public: - UsingUninitializedTry() noexcept : TryException("Using unitialized try") {} + UsingUninitializedTry() : TryException("Using unitialized try") {} }; /*