navigation

Outcome 2.1 library

Outcome is a set of tools for reporting and handling function failures in contexts where directly using C++ exception handling is unsuitable. Such contexts include:

Outcome addresses failure handling through returning a special type from functions, which is able to store either a successfully computed value (or void), or the information about failure. Outcome also comes with a set of idioms for dealing with such types.

Particular care has been taken to ensure that Outcome has the lowest possible impact on build times, thus making it suitable for use in the global headers of really large codebases. Storage layout is guaranteed and is C-compatible for result<T, E>1, thus making Outcome based code long term ABI-stable.

Sample usage

The main workhorse in the Outcome library is result<T>: it represents either a successfully computed value of type T, or a std::error_code/boost::system_error_code2 representing the reason for failure. You use it in the function’s return type:

auto read_data_from_file(string_view path) noexcept
  -> outcome::result<string>;
View this code on Github

It is possible to inspect the state manually:

if (auto rslt = read_data_from_file("config.cfg"))
  use_string(rslt.value());                   // returns string
else
  throw LibError{rslt.error(), "config.cfg"}; // returns error_code
View this code on Github

Or, if this function is called in another function that also returns result<T>, you can use a dedicated control statement:

auto process(const string& content) noexcept
  -> outcome::result<int>;

auto get_int_from_file(string_view path) noexcept
  -> outcome::result<int>
{
  OUTCOME_TRY(str, read_data_from_file(path));
  // if control gets here read_data_from_file() has succeeded
  return process(str);  // decltype(str) == string
}
View this code on Github

OUTCOME_TRY is a control statement. If the returned result<T> object contains an error information, the enclosing function is immediately returned with result<U> containing the same failure information; otherwise an automatic object of type T is available in scope.

This library joined the Boost C++ libraries in the 1.70 release (Spring 2019). It can be grafted into much older Boost releases if desired.


  1. If you choose a C-compatible T and E type. [return]
  2. result<T> defaults to std::error_code for Standalone Outcome, and to boost::system_error_code for Boost.Outcome. You can mandate a choice using std_result<T> or boost_result<T>. [return]