From 40c99417bd1f2019ecfcba8998cb8b9a19342d31 Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Mon, 8 Feb 2021 13:13:03 -0600 Subject: [PATCH] [PD] Catch Python exceptions in dtors (Coverity) In some PartDesign task dialogs, the destructors call functions that may throw exceptions. If that occurs and the exception is uncaught, this will ususally end up terminating the program. This commit adds try-catch blocks around each instance of that (identified by Coverity) and handles the Python exception in the normal reporting workflow. --- src/Mod/PartDesign/Gui/TaskChamferParameters.cpp | 10 ++++++++-- src/Mod/PartDesign/Gui/TaskDraftParameters.cpp | 10 ++++++++-- src/Mod/PartDesign/Gui/TaskFilletParameters.cpp | 10 ++++++++-- .../PartDesign/Gui/TaskMultiTransformParameters.cpp | 8 +++++++- src/Mod/PartDesign/Gui/TaskPipeParameters.cpp | 4 ++++ src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp | 10 ++++++++-- 6 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp b/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp index 75745dc5fb..83671682d5 100644 --- a/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskChamferParameters.cpp @@ -309,8 +309,14 @@ bool TaskChamferParameters::getFlipDirection(void) const TaskChamferParameters::~TaskChamferParameters() { - Gui::Selection().clearSelection(); - Gui::Selection().rmvSelectionGate(); + try { + Gui::Selection().clearSelection(); + Gui::Selection().rmvSelectionGate(); + } + catch (const Py::Exception&) { + Base::PyException e; // extract the Python error text + e.ReportException(); + } } bool TaskChamferParameters::event(QEvent *e) diff --git a/src/Mod/PartDesign/Gui/TaskDraftParameters.cpp b/src/Mod/PartDesign/Gui/TaskDraftParameters.cpp index 3a9298fc13..55e83b8e0b 100644 --- a/src/Mod/PartDesign/Gui/TaskDraftParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskDraftParameters.cpp @@ -317,8 +317,14 @@ bool TaskDraftParameters::getReversed(void) const TaskDraftParameters::~TaskDraftParameters() { - Gui::Selection().clearSelection(); - Gui::Selection().rmvSelectionGate(); + try { + Gui::Selection().clearSelection(); + Gui::Selection().rmvSelectionGate(); + } + catch (const Py::Exception&) { + Base::PyException e; // extract the Python error text + e.ReportException(); + } } bool TaskDraftParameters::event(QEvent *e) diff --git a/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp b/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp index 0e8b8e424b..037d9c0ef1 100644 --- a/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskFilletParameters.cpp @@ -212,8 +212,14 @@ double TaskFilletParameters::getLength(void) const TaskFilletParameters::~TaskFilletParameters() { - Gui::Selection().clearSelection(); - Gui::Selection().rmvSelectionGate(); + try { + Gui::Selection().clearSelection(); + Gui::Selection().rmvSelectionGate(); + } + catch (const Py::Exception&) { + Base::PyException e; // extract the Python error text + e.ReportException(); + } } bool TaskFilletParameters::event(QEvent *e) diff --git a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp index a5f4616615..2f51a28483 100644 --- a/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskMultiTransformParameters.cpp @@ -485,7 +485,13 @@ void TaskMultiTransformParameters::apply() TaskMultiTransformParameters::~TaskMultiTransformParameters() { - closeSubTask(); + try { + closeSubTask(); + } + catch (const Py::Exception&) { + Base::PyException e; // extract the Python error text + e.ReportException(); + } if (proxy) delete proxy; } diff --git a/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp b/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp index bfea0fd500..2789b33289 100644 --- a/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskPipeParameters.cpp @@ -163,6 +163,10 @@ TaskPipeParameters::~TaskPipeParameters() // getDocument() may raise an exception e.ReportException(); } + catch (const Py::Exception&) { + Base::PyException e; // extract the Python error text + e.ReportException(); + } } void TaskPipeParameters::updateUI() diff --git a/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp b/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp index 44b3424da4..22c2fa3025 100644 --- a/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp +++ b/src/Mod/PartDesign/Gui/TaskThicknessParameters.cpp @@ -288,8 +288,14 @@ int TaskThicknessParameters::getMode(void) const { TaskThicknessParameters::~TaskThicknessParameters() { - Gui::Selection().clearSelection(); - Gui::Selection().rmvSelectionGate(); + try { + Gui::Selection().clearSelection(); + Gui::Selection().rmvSelectionGate(); + } + catch (const Py::Exception&) { + Base::PyException e; // extract the Python error text + e.ReportException(); + } } bool TaskThicknessParameters::event(QEvent *e)