summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread/qexception.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/thread/qexception.cpp')
-rw-r--r--src/corelib/thread/qexception.cpp134
1 files changed, 89 insertions, 45 deletions
diff --git a/src/corelib/thread/qexception.cpp b/src/corelib/thread/qexception.cpp
index 1a6ee7bd01..a623dc1c6e 100644
--- a/src/corelib/thread/qexception.cpp
+++ b/src/corelib/thread/qexception.cpp
@@ -1,46 +1,10 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "qexception.h"
#include "QtCore/qshareddata.h"
-#if !defined(QT_NO_EXCEPTIONS) || defined(Q_CLANG_QDOC)
+#if !defined(QT_NO_EXCEPTIONS) || defined(Q_QDOC)
QT_BEGIN_NAMESPACE
@@ -62,7 +26,7 @@ QT_BEGIN_NAMESPACE
\snippet code/src_corelib_thread_qexception.cpp 1
If you throw an exception that is not a subclass of QException,
- the Qt functions will throw a QUnhandledException
+ the \l{Qt Concurrent} functions will throw a QUnhandledException
in the receiver thread.
When using QFuture, transferred exceptions will be thrown when calling the following functions:
@@ -92,12 +56,18 @@ QT_BEGIN_NAMESPACE
\class QUnhandledException
\inmodule QtCore
- \brief The UnhandledException class represents an unhandled exception in a worker thread.
+ \brief The QUnhandledException class represents an unhandled exception in a
+ Qt Concurrent worker thread.
\since 5.0
If a worker thread throws an exception that is not a subclass of QException,
- the Qt functions will throw a QUnhandledException
- on the receiver thread side.
+ the \l{Qt Concurrent} functions will throw a QUnhandledException on the receiver
+ thread side. The information about the actual exception that has been thrown
+ will be saved in the QUnhandledException class and can be obtained using the
+ exception() method. For example, you can process the exception held by
+ QUnhandledException in the following way:
+
+ \snippet code/src_corelib_thread_qexception.cpp 4
Inheriting from this class is not supported.
*/
@@ -127,6 +97,74 @@ QException *QException::clone() const
return new QException(*this);
}
+class QUnhandledExceptionPrivate : public QSharedData
+{
+public:
+ QUnhandledExceptionPrivate(std::exception_ptr exception) noexcept : exceptionPtr(exception) { }
+ std::exception_ptr exceptionPtr;
+};
+
+/*!
+ \fn QUnhandledException::QUnhandledException(std::exception_ptr exception = nullptr) noexcept
+ \since 6.0
+
+ Constructs a new QUnhandledException object. Saves the pointer to the actual
+ exception object if \a exception is passed.
+
+ \sa exception()
+*/
+QUnhandledException::QUnhandledException(std::exception_ptr exception) noexcept
+ : d(new QUnhandledExceptionPrivate(exception))
+{
+}
+
+/*!
+ Move-constructs a QUnhandledException, making it point to the same
+ object as \a other was pointing to.
+*/
+QUnhandledException::QUnhandledException(QUnhandledException &&other) noexcept
+ : d(std::exchange(other.d, {}))
+{
+}
+
+/*!
+ Constructs a QUnhandledException object as a copy of \a other.
+*/
+QUnhandledException::QUnhandledException(const QUnhandledException &other) noexcept
+ : d(other.d)
+{
+}
+
+/*!
+ Assigns \a other to this QUnhandledException object and returns a reference
+ to this QUnhandledException object.
+*/
+QUnhandledException &QUnhandledException::operator=(const QUnhandledException &other) noexcept
+{
+ d = other.d;
+ return *this;
+}
+
+/*!
+ \fn void QUnhandledException::swap(QUnhandledException &other)
+ \since 6.0
+
+ Swaps this QUnhandledException with \a other. This function is very fast and
+ never fails.
+*/
+
+/*!
+ \since 6.0
+
+ Returns a \l{https://en.cppreference.com/w/cpp/error/exception_ptr}{pointer} to
+ the actual exception that has been saved in this QUnhandledException. Returns a
+ \c null pointer, if it does not point to an exception object.
+*/
+std::exception_ptr QUnhandledException::exception() const
+{
+ return d->exceptionPtr;
+}
+
QUnhandledException::~QUnhandledException() noexcept
{
}
@@ -142,7 +180,7 @@ QUnhandledException *QUnhandledException::clone() const
return new QUnhandledException(*this);
}
-#if !defined(Q_CLANG_QDOC)
+#if !defined(Q_QDOC)
namespace QtPrivate {
@@ -178,9 +216,15 @@ void ExceptionStore::throwPossibleException()
std::rethrow_exception(exceptionHolder);
}
+void ExceptionStore::rethrowException() const
+{
+ Q_ASSERT(hasException());
+ std::rethrow_exception(exceptionHolder);
+}
+
} // namespace QtPrivate
-#endif //Q_CLANG_QDOC
+#endif //Q_QDOC
QT_END_NAMESPACE