open62541pp 0.17.0
C++ wrapper of open62541
Loading...
Searching...
No Matches
exception.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <exception>
4#include <new> // bad_alloc
5#include <stdexcept>
6
8
9namespace opcua {
10
11/**
12 * Exception for bad status codes from open62541 `UA_STATUSCODE_*`.
13 * @see statuscodes.h
14 */
15class BadStatus : public std::exception {
16public:
18 : code_(code) {}
19
20 UA_StatusCode code() const noexcept {
21 return code_;
22 }
23
24 const char* what() const noexcept override {
25 return UA_StatusCode_name(code_);
26 }
27
28private:
29 UA_StatusCode code_;
30};
31
32/**
33 * Specific exception for open62541 status code `UA_STATUSCODE_BADDISCONNECT`.
34 * Useful to catch Client disconnects.
35 */
41
42/**
43 * Exception for type-related errors.
44 */
45class TypeError : public std::runtime_error {
46public:
47 using runtime_error::runtime_error;
48};
49
50namespace detail {
51
52[[nodiscard]] constexpr bool isGood(UA_StatusCode code) noexcept {
53 return (code >> 30U) == 0x00;
54}
55
56[[nodiscard]] constexpr bool isUncertain(UA_StatusCode code) noexcept {
57 return (code >> 30U) == 0x01;
58}
59
60[[nodiscard]] constexpr bool isBad(UA_StatusCode code) noexcept {
61 return (code >> 30U) >= 0x02;
62}
63
64// NOLINTNEXTLINE(performance-unnecessary-value-param)
65[[nodiscard]] inline UA_StatusCode getStatusCode(std::exception_ptr eptr) noexcept {
66 try {
67 if (eptr) {
68 std::rethrow_exception(eptr);
69 }
70 } catch (const BadStatus& e) {
71 return e.code();
72 } catch (const std::bad_alloc& /*e*/) {
74 } catch (...) {
76 }
77 return UA_STATUSCODE_GOOD;
78}
79
80} // namespace detail
81
82/**
83 * Check the status code and throw a BadStatus exception if the status code is bad.
84 */
85constexpr void throwIfBad(UA_StatusCode code) {
86 if (detail::isBad(code)) {
87 // NOLINTNEXTLINE(hicpp-multiway-paths-covered)
88 switch (code) {
90 throw BadDisconnect();
91 default:
92 throw BadStatus(code);
93 }
94 }
95}
96
97} // namespace opcua
Specific exception for open62541 status code UA_STATUSCODE_BADDISCONNECT.
Definition exception.hpp:36
Exception for bad status codes from open62541 UA_STATUSCODE_*.
Definition exception.hpp:15
BadStatus(UA_StatusCode code)
Definition exception.hpp:17
UA_StatusCode code() const noexcept
Definition exception.hpp:20
const char * what() const noexcept override
Definition exception.hpp:24
Exception for type-related errors.
Definition exception.hpp:45
constexpr void throwIfBad(UA_StatusCode code)
Check the status code and throw a BadStatus exception if the status code is bad.
Definition exception.hpp:85
#define UA_STATUSCODE_BADINTERNALERROR
#define UA_STATUSCODE_BADOUTOFMEMORY
#define UA_STATUSCODE_GOOD
#define UA_STATUSCODE_BADDISCONNECT
UA_EXPORT const char * UA_StatusCode_name(UA_StatusCode code)
uint32_t UA_StatusCode