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