Salome HOME
catch exceptions in "rate = algo->GetProgress();"
[modules/smesh.git] / src / SMESH / SMESH_Mesh.cxx
index bcddd46d52d707b398cf7b48fa5eaee7da38a1de..691b86b76dd8bbf17895aa8bb04645a815f9e335 100644 (file)
@@ -66,6 +66,8 @@
 #include <TopTools_MapOfShape.hxx>
 #include <TopoDS_Iterator.hxx>
 
+#include "SMESH_TryCatch.hxx" // include after OCCT headers!
+
 #include "Utils_ExceptHandlers.hxx"
 
 #include <boost/thread/thread.hpp>
@@ -364,13 +366,10 @@ void SMESH_Mesh::Clear()
   {
     if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) )
     {
-      SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true,
-                                                               /*complexShapeFirst=*/true);
-      while ( smIt->more() )
-      {
-        sm = smIt->next();
-        sm->ComputeStateEngine( SMESH_subMesh::CLEAN );
-      }
+      sm->ComputeStateEngine( SMESH_subMesh::CLEAN );
+      sm->ComputeSubMeshStateEngine( SMESH_subMesh::CLEAN );
+      sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
+      sm->ComputeSubMeshStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
     }
   }
   _isModified = false;
@@ -1259,7 +1258,7 @@ void SMESH_Mesh::ExportMED(const char *        file,
                            bool                theAutoDimension)
   throw(SALOME_Exception)
 {
-  Unexpect aCatch(SalomeException);
+  SMESH_TRY;
 
   DriverMED_W_SMESHDS_Mesh myWriter;
   myWriter.SetFile         ( file, MED::EVersion(theVersion) );
@@ -1306,6 +1305,8 @@ void SMESH_Mesh::ExportMED(const char *        file,
   }
   // Perform export
   myWriter.Perform();
+
+  SMESH_CATCH( SMESH::throwSalomeEx );
 }
 
 //================================================================================
@@ -1485,13 +1486,27 @@ double SMESH_Mesh::GetComputeProgress() const
           algoDoneCost += smToCompute[i]->GetComputeCost();
         currentSubIds.Add( smToCompute[i]->GetId() );
       }
-      double rate = algo->GetProgress();
-      if ( !( 0. < rate && rate < 1.001 ))
+      double rate = 0;
+      try
+      {
+        OCC_CATCH_SIGNALS;
+        rate = algo->GetProgress();
+      }
+      catch (...) {
+#ifdef _DEBUG_
+        cerr << "Exception in " << algo->GetName() << "::GetProgress()" << endl;
+#endif
+      }
+      if ( 0. < rate && rate < 1.001 )
+      {
+        computedCost += rate * ( algoDoneCost + algoNotDoneCost );
+      }
+      else
       {
         rate = algo->GetProgressByTic();
+        computedCost += algoDoneCost + rate * algoNotDoneCost;
       }
       // cout << "rate: "<<rate << " algoNotDoneCost: " << algoNotDoneCost << endl;
-      computedCost += algoDoneCost + rate * algoNotDoneCost;
     }
 
   // get cost of already treated sub-meshes