Rerun C++ SDK
Loading...
Searching...
No Matches
error.hpp
1#pragma once
2
3#include <cstdint>
4#include <string>
5
6#ifdef __cpp_exceptions
7#include <stdexcept>
8#endif
9
10namespace arrow {
11 class Status;
12}
13
14struct rr_error;
15
16/// Return error if a given rerun::Error producing expression is not rerun::ErrorCode::Ok.
17#define RR_RETURN_NOT_OK(status_expr) \
18 do { \
19 const rerun::Error _status_ = status_expr; \
20 if (_status_.is_err()) { \
21 return _status_; \
22 } \
23 } while (false)
24
25namespace rerun {
26 /// Status codes returned by the SDK as part of `Status`.
27 ///
28 /// Category codes are used to group errors together, but are never returned directly.
29 enum class ErrorCode : uint32_t {
30 Ok = 0x0000'0000,
31 OutOfMemory,
32 NotImplemented,
33 SdkVersionMismatch,
34
35 // Invalid argument errors.
36 _CategoryArgument = 0x0000'0010,
37 UnexpectedNullArgument,
38 InvalidStringArgument,
39 InvalidEnumValue,
40 InvalidRecordingStreamHandle,
41 InvalidSocketAddress,
42 InvalidComponentTypeHandle,
43 InvalidTensorDimension,
44 FileRead,
45
46 // Recording stream errors
47 _CategoryRecordingStream = 0x0000'0100,
48 RecordingStreamRuntimeFailure,
49 RecordingStreamCreationFailure,
50 RecordingStreamSaveFailure,
51 RecordingStreamStdoutFailure,
52 RecordingStreamSpawnFailure,
53 RecordingStreamChunkValidationFailure,
54
55 // Arrow data processing errors.
56 _CategoryArrow = 0x0000'1000,
57 ArrowFfiSchemaImportError,
58 ArrowFfiArrayImportError,
59
60 // Errors relating to file IO.
61 _CategoryFileIO = 0x0001'0000,
62 FileOpenFailure,
63
64 // Errors directly translated from arrow::StatusCode.
65 _CategoryArrowCppStatus = 0x1000'0000,
66 ArrowStatusCode_KeyError,
67 ArrowStatusCode_TypeError,
68 ArrowStatusCode_Invalid,
69 ArrowStatusCode_IOError,
70 ArrowStatusCode_CapacityError,
71 ArrowStatusCode_IndexError,
72 ArrowStatusCode_Cancelled,
73 ArrowStatusCode_UnknownError,
74 ArrowStatusCode_NotImplemented,
75 ArrowStatusCode_SerializationError,
76 ArrowStatusCode_RError,
77 ArrowStatusCode_CodeGenError,
78 ArrowStatusCode_ExpressionValidationError,
79 ArrowStatusCode_ExecutionError,
80 ArrowStatusCode_AlreadyExists,
81
82 Unknown = 0xFFFF'FFFF,
83 };
84
85 /// Callback function type for log handlers.
86 using StatusLogHandler = void (*)(const class Error& status, void* userdata);
87
88 /// Status outcome object (success or error) returned for fallible operations.
89 ///
90 /// Converts to `true` for success, `false` for failure.
91 class [[nodiscard]] Error {
92 public:
93 /// Result code for the given operation.
94 ErrorCode code = ErrorCode::Ok;
95
96 /// Human readable description of the error.
97 std::string description;
98
99 public:
100 Error() = default;
101
102 Error(ErrorCode _code, std::string _description)
103 : code(_code), description(std::move(_description)) {}
104
105 /// Construct from a C status object.
106 Error(const rr_error& status);
107
108 /// Construct from an arrow status.
109 Error(const arrow::Status& status);
110
111 /// Creates a new error set to ok.
112 static Error ok() {
113 return Error();
114 }
115
116 /// Compare two errors for equality. Requires the description to match.
117 bool operator==(const Error& other) const {
118 return code == other.code && description == other.description;
119 }
120
121 /// Returns true if the code is `Ok`.
122 bool is_ok() const {
123 return code == ErrorCode::Ok;
124 }
125
126 /// Returns true if the code is not `Ok`.
127 bool is_err() const {
128 return code != ErrorCode::Ok;
129 }
130
131 /// Sets global log handler called for `handle`.
132 ///
133 /// The default will log to stderr, unless `RERUN_STRICT` is set to something truthy.
134 ///
135 /// \param handler The handler to call, or `nullptr` to reset to the default.
136 /// \param userdata Userdata pointer that will be passed to each invocation of the handler.
137 ///
138 /// @see log, log_on_failure
139 static void set_log_handler(StatusLogHandler handler, void* userdata = nullptr);
140
141 /// Handle this error based on the set log handler.
142 ///
143 /// If there is no error, nothing happens.
144 ///
145 /// If you have set a log handler with `set_log_handler`, it will be called.
146 /// Else if the `RERUN_STRICT` env-var is set to something truthy,
147 /// an exception will be thrown (if `__cpp_exceptions` are enabled),
148 /// or the program will abort.
149 ///
150 /// If no log handler is installed, and we are not in strict mode,
151 /// the error will be logged to stderr.
152 void handle() const;
153
154 /// Calls the `handle` method and then exits the application with code 1 if the error is not `Ok`.
155 void exit_on_failure() const;
156
157#ifdef __cpp_exceptions
158 /// Throws a `std::runtime_error` if the status is not `Ok`.
159 void throw_on_failure() const {
160 if (is_err()) {
161 throw std::runtime_error(description);
162 }
163 }
164#endif
165 };
166} // namespace rerun
Status outcome object (success or error) returned for fallible operations.
Definition error.hpp:91
void handle() const
Handle this error based on the set log handler.
bool is_err() const
Returns true if the code is not Ok.
Definition error.hpp:127
bool is_ok() const
Returns true if the code is Ok.
Definition error.hpp:122
static Error ok()
Creates a new error set to ok.
Definition error.hpp:112
static void set_log_handler(StatusLogHandler handler, void *userdata=nullptr)
Sets global log handler called for handle.
Error(const rr_error &status)
Construct from a C status object.
bool operator==(const Error &other) const
Compare two errors for equality. Requires the description to match.
Definition error.hpp:117
ErrorCode code
Result code for the given operation.
Definition error.hpp:94
Error(const arrow::Status &status)
Construct from an arrow status.
void exit_on_failure() const
Calls the handle method and then exits the application with code 1 if the error is not Ok.
std::string description
Human readable description of the error.
Definition error.hpp:97
All Rerun C++ types and functions are in the rerun namespace or one of its nested namespaces.
Definition rerun.hpp:22
void(*)(const class Error &status, void *userdata) StatusLogHandler
Callback function type for log handlers.
Definition error.hpp:86
ErrorCode
Status codes returned by the SDK as part of Status.
Definition error.hpp:29