From c5028e7a82d699364e795a27d87a7ac1f50be343 Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Fri, 4 Jun 2021 15:46:00 +0200
Subject: [PATCH] catching exceptions related to fs::create_directories

---
 .../armem/core/diskmemory/EntityInstance.cpp  | 12 ++++++++-
 .../armem/core/diskmemory/EntitySnapshot.cpp  | 20 ++++++++++++--
 .../armem/core/diskmemory/ProviderSegment.cpp | 27 +++++++++++++++++--
 3 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
index 49bfe419d..9b6d3f8a1 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
@@ -4,6 +4,7 @@
 #include <fstream>
 
 #include "../../core/error.h"
+#include "ArmarXCore/core/exceptions/LocalException.h"
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 #include <RobotAPI/libraries/aron/core/io/dataIO/converter/Converter.h>
@@ -103,7 +104,16 @@ namespace armarx::armem::d_ltm
     void EntityInstance::setTo(const wm::EntityInstance& m)
     {
         std::filesystem::path p = _fullPath();
-        std::filesystem::create_directories(p);
+
+        try
+        {
+            std::filesystem::create_directories(p);
+        }
+        catch (...)
+        {
+            ARMARX_WARNING << GetHandledExceptionString();
+            return;
+        }
 
         std::filesystem::path d = p / (std::string(DATA_FILENAME) + ".json");
 
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.cpp b/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.cpp
index 199e4f2c9..cc1124ab2 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.cpp
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/EntitySnapshot.cpp
@@ -69,7 +69,15 @@ namespace armarx::armem::d_ltm
 
     void EntitySnapshot::setTo(const wm::EntitySnapshot& m)
     {
-        std::filesystem::create_directories(_fullPath());
+        try
+        {
+            std::filesystem::create_directories(_fullPath());
+        }
+        catch (...)
+        {
+            ARMARX_WARNING << GetHandledExceptionString();
+            return;
+        }
 
         // We remove the contente here and reset it with new values
         _container.clear();
@@ -77,7 +85,15 @@ namespace armarx::armem::d_ltm
         int i = 0;
         for (const auto& s : m.instances())
         {
-            std::filesystem::create_directory(_fullPath() / std::to_string(i));
+            try
+            {
+                std::filesystem::create_directory(_fullPath() / std::to_string(i));
+            }
+            catch (...)
+            {
+                ARMARX_WARNING << GetHandledExceptionString();
+                continue;;
+            }
 
             auto wms = _container.emplace_back(id().withInstanceIndex(i++));
             wms.path = path;
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.cpp b/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.cpp
index 2d5ed3d4a..77d38171c 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.cpp
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/ProviderSegment.cpp
@@ -81,7 +81,18 @@ namespace armarx::armem::d_ltm
 
     void ProviderSegment::append(const wm::ProviderSegment& m)
     {
-        std::filesystem::create_directories(_fullPath());
+
+        try
+        {
+            std::filesystem::create_directories(_fullPath());
+
+        }
+        catch (...)
+        {
+            ARMARX_WARNING << GetHandledExceptionString();
+            return;
+        }
+
         TypeIO::writeAronType(_aronType, _fullPath());
 
         for (const auto& [k, s] : m.container())
@@ -92,7 +103,19 @@ namespace armarx::armem::d_ltm
             }
             else
             {
-                std::filesystem::create_directory(_fullPath() / k);
+
+                try
+                {
+                    std::filesystem::create_directory(_fullPath() / k);
+                    continue;
+
+                }
+                catch (...)
+                {
+                    ARMARX_WARNING << GetHandledExceptionString();
+                    return;
+                }
+
                 auto wms = _container.emplace(std::make_pair(k, id().withEntityName(k)));
                 wms.first->second.path = path;
                 wms.first->second.append(s);
-- 
GitLab