userver: userver/ugrpc/client/exceptions.hpp Source File
Loading...
Searching...
No Matches
exceptions.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/ugrpc/client/exceptions.hpp
4/// @brief Exceptions thrown by gRPC client streams
5
6#include <exception>
7#include <string>
8#include <string_view>
9
10#include <grpcpp/support/status.h>
11
12USERVER_NAMESPACE_BEGIN
13
14/// Asynchronous gRPC driver
15namespace ugrpc {}
16
17/// Client-side utilities
18namespace ugrpc::client {
19
20/// @brief Base exception for all the client errors
21class BaseError : public std::exception {
22public:
23 explicit BaseError(std::string message);
24
25 const char* what() const noexcept override;
26
27private:
28 std::string message_;
29};
30
31/// @brief Error during an RPC
32class RpcError : public BaseError {
33public:
34 RpcError(std::string_view call_name, std::string_view additional_info);
35};
36
37/// @brief RPC failed without a gRPC status because it was interrupted at the transport level
38/// (cancelled via `TryCancel`, or the connection was lost/reset). For a unary call it is thrown
39/// only when no concrete gRPC status is available; when a status is available it is instead
40/// surfaced as the corresponding @ref ugrpc::client::ErrorWithStatus. Retryable.
41/// Note: Deadline expiration throws @ref ugrpc::client::DeadlineExceededError
42class RpcInterruptedError final : public RpcError {
43public:
44 RpcInterruptedError(std::string_view call_name, std::string_view stage);
45};
46
47/// @brief RPC failed due to task cancellation
48class RpcCancelledError final : public RpcError {
49public:
50 RpcCancelledError(std::string_view call_name, std::string_view stage);
51};
52
53/// @brief Error with grpc::Status details
54/// @see <grpcpp/impl/codegen/status_code_enum.h> for error code details
55class ErrorWithStatus : public RpcError {
56public:
57 ErrorWithStatus(std::string_view call_name, grpc::Status&& status);
58
59 const grpc::Status& GetStatus() const noexcept;
60
61private:
62 grpc::Status status_;
63};
64
65/// @brief Concrete errors for all the error codes
66/// @see <grpcpp/impl/codegen/status_code_enum.h> for error code details
67/// @{
68class CancelledError final : public ErrorWithStatus {
69public:
70 using ErrorWithStatus::ErrorWithStatus;
71};
72
73class UnknownError final : public ErrorWithStatus {
74public:
75 using ErrorWithStatus::ErrorWithStatus;
76};
77
78class InvalidArgumentError final : public ErrorWithStatus {
79public:
80 using ErrorWithStatus::ErrorWithStatus;
81};
82
83class DeadlineExceededError final : public ErrorWithStatus {
84public:
85 using ErrorWithStatus::ErrorWithStatus;
86};
87
88class NotFoundError final : public ErrorWithStatus {
89public:
90 using ErrorWithStatus::ErrorWithStatus;
91};
92
93class AlreadyExistsError final : public ErrorWithStatus {
94public:
95 using ErrorWithStatus::ErrorWithStatus;
96};
97
98class PermissionDeniedError final : public ErrorWithStatus {
99public:
100 using ErrorWithStatus::ErrorWithStatus;
101};
102
103class ResourceExhaustedError final : public ErrorWithStatus {
104public:
105 using ErrorWithStatus::ErrorWithStatus;
106};
107
108class FailedPreconditionError final : public ErrorWithStatus {
109public:
110 using ErrorWithStatus::ErrorWithStatus;
111};
112
113class AbortedError final : public ErrorWithStatus {
114public:
115 using ErrorWithStatus::ErrorWithStatus;
116};
117
118class OutOfRangeError final : public ErrorWithStatus {
119public:
120 using ErrorWithStatus::ErrorWithStatus;
121};
122
123class UnimplementedError final : public ErrorWithStatus {
124public:
125 using ErrorWithStatus::ErrorWithStatus;
126};
127
128class InternalError final : public ErrorWithStatus {
129public:
130 using ErrorWithStatus::ErrorWithStatus;
131};
132
133class UnavailableError final : public ErrorWithStatus {
134public:
135 using ErrorWithStatus::ErrorWithStatus;
136};
137
138class DataLossError final : public ErrorWithStatus {
139public:
140 using ErrorWithStatus::ErrorWithStatus;
141};
142
143class UnauthenticatedError final : public ErrorWithStatus {
144public:
145 using ErrorWithStatus::ErrorWithStatus;
146};
147/// @}
148
149[[noreturn]] void ThrowErrorWithStatus(std::string_view call_name, grpc::Status&& status);
150
151} // namespace ugrpc::client
152
153USERVER_NAMESPACE_END