summaryrefslogtreecommitdiffstats
path: root/yql/essentials/utils/exception_utils.cpp
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