blob: c83556223d46f06a795c9b4b0eee188f6b3a0e01 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#include "exception_utils.h"
#include <util/generic/overloaded.h>
#include <util/generic/yexception.h>
#include <concepts>
#include <exception>
namespace NYql::NInternal {
namespace {
using TSafeMessage = std::variant<const char*, TString>;
const char* GetCurrentMessageSafe(const TSafeMessage& message Y_LIFETIME_BOUND) noexcept {
if (auto* str = std::get_if<TString>(&message)) {
return str->c_str();
}
if (auto* ptr = std::get_if<const char*>(&message)) {
return *ptr;
}
return "Message is corrupted";
}
TSafeMessage SafeCurrentExceptionMessage() noexcept {
try {
return CurrentExceptionMessage();
} catch (...) {
static constexpr char ErrorMessage[] = "Cannot take current exception message in WithAbortOnException";
return TSafeMessage(ErrorMessage);
}
}
} // namespace
void DieWithCurrentException(const char* moduleName) noexcept {
Y_ABORT("Die inside WithAbortOnException of %s: %s", moduleName, GetCurrentMessageSafe(SafeCurrentExceptionMessage()));
}
} // namespace NYql::NInternal
|