File indexing completed on 2024-05-05 03:54:21

0001 // SPDX-License-Identifier: LGPL-2.0-or-later
0002 
0003 #include "exception_p.h"
0004 
0005 #include <exception>
0006 
0007 #include <QUnhandledException>
0008 
0009 namespace
0010 {
0011 std::optional<KCrash::ExceptionMetadata> qUnhandledExceptionMetadata(const QUnhandledException &exception)
0012 {
0013     auto exceptionPtr = exception.exception();
0014     if (!exceptionPtr) {
0015         return {};
0016     }
0017 
0018     try {
0019         std::rethrow_exception(exceptionPtr);
0020     } catch (const std::exception &e) {
0021         return KCrash::ExceptionMetadata{
0022             .ptr = exceptionPtr,
0023             .klass = typeid(e).name(),
0024             .what = e.what(),
0025         };
0026     }
0027 
0028     return {};
0029 }
0030 } // namespace
0031 
0032 namespace KCrash
0033 {
0034 std::optional<ExceptionMetadata> exceptionMetadata()
0035 {
0036     auto exceptionPtr = std::current_exception();
0037     if (!exceptionPtr) {
0038         return {};
0039     }
0040 
0041     try {
0042         std::rethrow_exception(exceptionPtr);
0043     } catch (const QUnhandledException &e) {
0044         return qUnhandledExceptionMetadata(e);
0045     } catch (const std::bad_alloc &e) {
0046         return {};
0047     } catch (const std::exception &e) {
0048         return KCrash::ExceptionMetadata{
0049             .ptr = exceptionPtr,
0050             .klass = typeid(e).name(),
0051             .what = e.what(),
0052         };
0053     }
0054 
0055     return {};
0056 }
0057 } // namespace KCrash