diff --git a/src/App/Application.cpp b/src/App/Application.cpp index 59fc634f09..aa67fb1e7e 100644 --- a/src/App/Application.cpp +++ b/src/App/Application.cpp @@ -599,7 +599,13 @@ public: ~DocOpenGuard() { if(flag) { flag = false; - signal(); + try { + signal(); + } + catch (const boost::exception&) { + // reported by code analyzers + Base::Console().Warning("~DocOpenGuard: Unexpected boost exception\n"); + } } } }; @@ -926,7 +932,13 @@ Application::TransactionSignaller::TransactionSignaller(bool abort, bool signal) Application::TransactionSignaller::~TransactionSignaller() { if(--_TransSignalCount == 0 && _TransSignalled) { _TransSignalled = false; - GetApplication().signalCloseTransaction(abort); + try { + GetApplication().signalCloseTransaction(abort); + } + catch (const boost::exception&) { + // reported by code analyzers + Base::Console().Warning("~TransactionSignaller: Unexpected boost exception\n"); + } } } diff --git a/src/Base/Exception.cpp b/src/Base/Exception.cpp index 522429de6d..cd88fe97c7 100644 --- a/src/Base/Exception.cpp +++ b/src/Base/Exception.cpp @@ -125,7 +125,7 @@ PyObject * Exception::getPyObject(void) void Exception::setPyObject( PyObject * pydict) { - if (pydict!=NULL) { + if (pydict && Py::_Dict_Check(pydict)) { Py::Dict edict(pydict); if (edict.hasKey("sfile")) _file = static_cast(Py::String(edict.getItem("sfile"))); diff --git a/src/Gui/TaskElementColors.cpp b/src/Gui/TaskElementColors.cpp index 1b3e708c64..c9d3dd30b6 100644 --- a/src/Gui/TaskElementColors.cpp +++ b/src/Gui/TaskElementColors.cpp @@ -106,7 +106,12 @@ public: } ~Private() { - vpParent->OnTopWhenSelected.setValue(onTopMode); + try { + vpParent->OnTopWhenSelected.setValue(onTopMode); + } + catch (const Base::Exception& e) { + e.ReportException(); + } } bool allow(App::Document *doc, App::DocumentObject *obj, const char *subname) { diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index 7133107dc6..cbbab73393 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -1062,7 +1062,8 @@ void View3DInventorViewer::setupEditingRoot(SoNode *node, const Base::Matrix4D * ViewProviderLink::updateLinks(editViewProvider); } -void View3DInventorViewer::resetEditingRoot(bool updateLinks) { +void View3DInventorViewer::resetEditingRoot(bool updateLinks) +{ if(!editViewProvider || pcEditingRoot->getNumChildren()<=1) return; if(!restoreEditingRoot) { @@ -1077,8 +1078,25 @@ void View3DInventorViewer::resetEditingRoot(bool updateLinks) { for(int i=1,count=pcEditingRoot->getNumChildren();iaddChild(pcEditingRoot->getChild(i)); pcEditingRoot->getChildren()->truncate(1); - if(updateLinks) - ViewProviderLink::updateLinks(editViewProvider); + + // handle exceptions eventually raised by ViewProviderLink + try { + if (updateLinks) + ViewProviderLink::updateLinks(editViewProvider); + } + catch (const Py::Exception& e) { + Py::Object o = Py::type(e); + if (o.isString()) { + Py::String s(o); + Base::Console().Warning("%s\n", s.as_std_string("utf-8").c_str()); + } + else { + Py::String s(o.repr()); + Base::Console().Warning("%s\n", s.as_std_string("utf-8").c_str()); + } + // Prints message to console window if we are in interactive mode + PyErr_Print(); + } } SoPickedPoint* View3DInventorViewer::getPointOnRay(const SbVec2s& pos, ViewProvider* vp) const