diff options
author | svkrasnov <[email protected]> | 2022-02-15 13:44:41 +0300 |
---|---|---|
committer | svkrasnov <[email protected]> | 2022-02-15 13:44:41 +0300 |
commit | 19819502b97c522946fb88cacc5c7ea42a6dbec8 (patch) | |
tree | 3d9b598232d4e5bfda2f02a9218d67c60cd798c6 /util/generic/yexception.cpp | |
parent | 441ade95e65652a8c592dfa3a88c14cddcf137f6 (diff) |
IGNIETFERRO-1975, BIGRT-39: add TBackTrace::FromCurrentException() to CurrentExceptionMessage()
support TBackTrace::FromCurrentException() in CurrentExceptionMessage()
ref:ca43c6538722fc9d169d92f85395093a21136884
Diffstat (limited to 'util/generic/yexception.cpp')
-rw-r--r-- | util/generic/yexception.cpp | 30 |
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 (...) { } |