summaryrefslogtreecommitdiffstats
path: root/util/generic/yexception.cpp
diff options
context:
space:
mode:
authorsvkrasnov <[email protected]>2022-02-18 00:11:31 +0300
committersvkrasnov <[email protected]>2022-02-18 00:11:31 +0300
commit5d9b03f7d5e4d38860ff05886839b0224222da3e (patch)
tree85920b5ab330a7d9dab3ad6bf5c75d54d08a8bd1 /util/generic/yexception.cpp
parent59b572e5c9c4932e5d976212fc0ef905b1ec75b4 (diff)
IGNIETFERRO-1975, BIGRT-39 [RESUBMIT]: add TBackTrace::FromCurrentException() to CurrentExceptionMessage()
ref:8d5b72512d2b80cfd1ae859a4175cc92cf32a99a
Diffstat (limited to 'util/generic/yexception.cpp')
-rw-r--r--util/generic/yexception.cpp30
1 files changed, 24 insertions, 6 deletions
diff --git a/util/generic/yexception.cpp b/util/generic/yexception.cpp
index 26c75b5f51d..7bfed2878d0 100644
--- a/util/generic/yexception.cpp
+++ b/util/generic/yexception.cpp
@@ -14,21 +14,39 @@ TString FormatExc(const std::exception& exception) {
return TString::Join(TStringBuf("("), TypeName(exception), TStringBuf(") "), exception.what());
}
+static TString BackTraceToString(const TBackTrace& backtrace) {
+ try {
+ Y_ENSURE(backtrace.size() > 0, "backtrace is empty");
+ return backtrace.PrintToString();
+ } catch (const std::exception& e) {
+ return TString::Join("Failed to print backtrace: ", FormatExc(e));
+ }
+}
+
TString CurrentExceptionMessage() {
auto exceptionPtr = std::current_exception();
if (exceptionPtr) {
try {
std::rethrow_exception(exceptionPtr);
} catch (const yexception& e) {
- const TBackTrace* bt = e.BackTrace();
-
- if (bt) {
- return TString::Join(bt->PrintToString(), TStringBuf("\n"), FormatExc(e));
+ const TBackTrace* btPtr;
+#ifdef _YNDX_LIBUNWIND_ENABLE_EXCEPTION_BACKTRACE
+ TBackTrace backtrace = TBackTrace::FromCurrentException();
+ btPtr = &backtrace;
+#else
+ btPtr = e.BackTrace();
+ if (!btPtr) {
+ return FormatExc(e);
}
-
- return FormatExc(e);
+#endif
+ return TString::Join(BackTraceToString(*btPtr), TStringBuf("\n"), FormatExc(e));
} catch (const std::exception& e) {
+#ifdef _YNDX_LIBUNWIND_ENABLE_EXCEPTION_BACKTRACE
+ TBackTrace backtrace = TBackTrace::FromCurrentException();
+ return TString::Join(BackTraceToString(backtrace), TStringBuf("\n"), FormatExc(e));
+#else
return FormatExc(e);
+#endif
} catch (...) {
}