diff --git a/lib/cargo/error.hpp b/lib/cargo/error.hpp index fe9ee8689706948ca2fb0d6f323ad6cc18cd8724..598944be551b4a31a95465774b9c0d55b914fdbb 100644 --- a/lib/cargo/error.hpp +++ b/lib/cargo/error.hpp @@ -44,6 +44,8 @@ class error_code { not_implemented = 2, no_such_transfer = 3, transfer_in_progress = 4, + /* ... */ + other = 127, }; public: @@ -52,6 +54,8 @@ public: static const error_code not_implemented; static const error_code no_such_transfer; static const error_code transfer_in_progress; + /* ... */ + static const error_code other; constexpr error_code() : error_code(error_value::success) {} constexpr explicit error_code(error_value v) @@ -99,6 +103,8 @@ constexpr error_code error_code::no_such_transfer{ error_value::no_such_transfer}; constexpr error_code error_code::transfer_in_progress{ error_value::transfer_in_progress}; +/* ... */ +constexpr error_code error_code::other{error_value::other}; static constexpr cargo::error_code make_system_error(std::uint32_t ec) { diff --git a/lib/error.cpp b/lib/error.cpp index 9987a4572d91fade361b61a74902c22beb74d56f..851b5754a59ac9879ef01f55d088bd65d71ac046 100644 --- a/lib/error.cpp +++ b/lib/error.cpp @@ -281,6 +281,9 @@ error_code::name() const { return "CARGO_NO_SUCH_TRANSFER"; case error_value::transfer_in_progress: return "CARGO_TRANSFER_IN_PROGRESS"; + /* ... */ + case error_value::other: + return "CARGO_OTHER"; default: return "CARGO_UNKNOWN_ERROR"; } @@ -302,6 +305,9 @@ error_code::message() const { return "no such transfer"; case error_value::transfer_in_progress: return "transfer in progress"; + /* ... */ + case error_value::other: + return "other"; default: return "unknown error"; } diff --git a/src/worker/mpio_read.cpp b/src/worker/mpio_read.cpp index dedd28428a80e19e55ec8c116a4430704d0121b1..1c6bbd0e4b187bd13069bd8c677f99dbfb41de44 100644 --- a/src/worker/mpio_read.cpp +++ b/src/worker/mpio_read.cpp @@ -144,8 +144,12 @@ mpio_read::operator()() const { } catch(const posix_file::io_error& e) { LOGGER_ERROR("{}() failed: {}", e.where(), e.what()); return make_system_error(e.error_code()); + } catch (const std::system_error& e) { + LOGGER_ERROR("Unexpected system error: {}", e.what()); + return make_system_error(e.code().value()); } catch(const std::exception& e) { - std::cerr << e.what() << '\n'; + LOGGER_ERROR("Unexpected exception: {}", e.what()); + return error_code::other; } return error_code::success; diff --git a/src/worker/mpio_write.cpp b/src/worker/mpio_write.cpp index 26cb8125bad24ae9abc8306ea3d0b6843d72c1ab..5f40048faaecf7c60d3a632446c0f19bb6e04e2e 100644 --- a/src/worker/mpio_write.cpp +++ b/src/worker/mpio_write.cpp @@ -146,8 +146,12 @@ mpio_write::operator()() const { } catch(const posix_file::io_error& e) { LOGGER_ERROR("{}() failed: {}", e.where(), e.what()); return make_system_error(e.error_code()); + } catch (const std::system_error& e) { + LOGGER_ERROR("Unexpected system error: {}", e.what()); + return make_system_error(e.code().value()); } catch(const std::exception& e) { - std::cerr << e.what() << '\n'; + LOGGER_ERROR("Unexpected exception: {}", e.what()); + return error_code::other; } return error_code::success; diff --git a/tests/tests.cpp b/tests/tests.cpp index 6ec9d742c7b90f22b420b7b8f840c24559481883..e2b235784eb32c4301ab4aa590b62e57709069b5 100644 --- a/tests/tests.cpp +++ b/tests/tests.cpp @@ -40,11 +40,15 @@ using namespace std::literals; using namespace std::chrono_literals; -std::ostream& -operator<<(std::ostream& os, const cargo::error_code& ec) { - os << ec.name(); - return os; -} +namespace Catch { +template <> +struct StringMaker { + static std::string + convert(const cargo::error_code& ec) { + return std::string{ec.name()}; + } +}; +} // namespace Catch CATCH_REGISTER_ENUM(cargo::transfer_state, cargo::transfer_state::pending, cargo::transfer_state::running, @@ -240,6 +244,7 @@ SCENARIO("Parallel reads", "[flex_stager][parallel_reads]") { // wait for the transfer to complete auto s = tx.wait(); + CAPTURE(s.error()); REQUIRE(s.state() == cargo::transfer_state::completed); REQUIRE(s.error() == cargo::error_code::success); @@ -301,6 +306,7 @@ SCENARIO("Parallel writes", "[flex_stager][parallel_writes]") { // wait for the transfer to complete auto s = tx.wait(); + CAPTURE(s.error()); REQUIRE(s.state() == cargo::transfer_state::completed); REQUIRE(s.error() == cargo::error_code::success);