diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp
index add1b800c01ad8186008d55574559e0705527a4b..72f2eb78f04b610b0be55fc7a4d9fdabb90cab6d 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/Generator.cpp
@@ -253,8 +253,7 @@ namespace armarx::aron::codegenerator::cpp
         b->addLine("using _Aron_TNonConst [[maybe_unused]] = typename ReaderT::InputTypeNonConst;");
 
         b->addLine("this->resetSoft();");
-        b->addLine("if (" + ARON_READER_ACCESSOR + ".readNull(input))");
-        b->addLineAsBlock("throw ::armarx::aron::error::AronException(__PRETTY_FUNCTION__, \"The input to the read method must not be null.\");");
+        b->addLine("ARMARX_CHECK_AND_THROW(!" + ARON_READER_ACCESSOR + ".readNull(input), ::armarx::aron::error::AronException(__PRETTY_FUNCTION__, \"The input to the read method must not be null.\"));");
 
         b->addLine("try");
         b->addBlock(this->getReadBlock("", "input"));
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp
index 8876c89051059f4a4b52c1379540a04681d7b269..569d5be67dfd601cf09157655ff0542f022680ae 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/ndarray/Matrix.cpp
@@ -119,7 +119,9 @@ namespace armarx::aron::codegenerator::cpp::generator
             block_if_data->addLine(cppAccessor + nextEl() + "resize(" + dims + ".at(0), " + dims + ".at(1));");
         }
 
-        block_if_data->addLine("ARMARX_CHECK(" + cppAccessor + nextEl() + "rows() == " + dims + ".at(0) and " + cppAccessor + nextEl() + "cols() == " + dims + ".at(1)) << \"Dimensions of member '"+cppAccessor+"' do not match (simox::alg::to_string(dims, ',')). Got (" + cppAccessor + nextEl() + "rows(), " + cppAccessor + nextEl() + "cols()) instead.\";");
+        block_if_data->addLine("ARMARX_CHECK_AND_THROW(" + cppAccessor + nextEl() + "rows() == " + dims + ".at(0) and " + cppAccessor + nextEl() + "cols() == " + dims + ".at(1), ::armarx::aron::error::AronException(__PRETTY_FUNCTION__, \"Received wrong dimensions for member '"+cppAccessor+"'.\"));");
+        block_if_data->addLine("ARMARX_CHECK_AND_THROW(" + type + " == \"" + std::get<0>(ElementType2Cpp.at(this->type.getElementType())) + "\", ::armarx::aron::error::AronException(__PRETTY_FUNCTION__, \"Received wrong type for member '"+cppAccessor+"'.\"));");
+
         block_if_data->addLine("std::memcpy(reinterpret_cast<unsigned char*>(" + cppAccessor + nextEl() + "data()), "+data+".data(), "+data+".size());");
         return resolveMaybeReadBlock(block_if_data, cppAccessor, variantAccessor);
     }
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp
index c1c77424ba3d97dc217bd846bb1335023761fa2a..4e5b54e5c6a41bd74147a5445d4d5abdb298b5a4 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/IntEnumClass.cpp
@@ -134,7 +134,10 @@ namespace armarx::aron::codegenerator::cpp::generator
         CppBlockPtr block_if_data = std::make_shared<CppBlock>();
         block_if_data->addLine("int " + INT_ENUM_TMP_VALUE + ";");
         block_if_data->addLine("" + ARON_READER_ACCESSOR + ".readPrimitive("+variantAccessor+", "+INT_ENUM_TMP_VALUE+"); // of top level enum " + getInstantiatedCppTypename());
-        block_if_data->addLine("value = ValueToEnumMap.at("+INT_ENUM_TMP_VALUE+");");
+
+        block_if_data->addLine("auto valueToEnumMap_iterator = ValueToEnumMap.find("+INT_ENUM_TMP_VALUE+");");
+        block_if_data->addLine("ARMARX_CHECK_AND_THROW(valueToEnumMap_iterator != ValueToEnumMap.end(), ::armarx::aron::error::AronException(__PRETTY_FUNCTION__, \"Missing enum for value '\" + std::to_string(" + INT_ENUM_TMP_VALUE + ") + \"' in aron enum '" + getFullClassCppTypename() + "'.\"))");
+        block_if_data->addLine("value = valueToEnumMap_iterator->second;");
         return block_if_data;
     }
 
diff --git a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp
index 24a3b85a19efe13186acfa8e4d969b56a3f071d2..5d5409792c245220df2a0f4918c02ef9412fa6af 100644
--- a/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp
+++ b/source/RobotAPI/libraries/aron/codegeneration/codegenerator/codewriter/cpp/generator/toplevel/ObjectClass.cpp
@@ -215,7 +215,7 @@ namespace armarx::aron::codegenerator::cpp::generator
             const auto child_s = FromAronType(*child);
             std::string child_accessor = OBJECT_MEMBERS_ACCESSOR + "_" + key + "_iterator";
             block_if_data->addLine("auto " + child_accessor + " = " + OBJECT_MEMBERS_ACCESSOR + ".find(\"" + key + "\");");
-            block_if_data->addLine("ARMARX_CHECK(" + child_accessor + " != " + OBJECT_MEMBERS_ACCESSOR + ".end()) << \"Missing member '" + key + "' in aron object '" + getFullClassCppTypename() + "'.\";");
+            block_if_data->addLine("ARMARX_CHECK_AND_THROW(" + child_accessor + " != " + OBJECT_MEMBERS_ACCESSOR + ".end(), ::armarx::aron::error::AronException(__PRETTY_FUNCTION__, \"Missing member '" + key + "' in aron object '" + getFullClassCppTypename() + "'.\"));");
             block_if_data->appendBlock(child_s->getReadBlock(key, child_accessor + "->second"));
         }
         return block_if_data;
diff --git a/source/RobotAPI/libraries/aron/core/Exception.h b/source/RobotAPI/libraries/aron/core/Exception.h
index 52de8098900e7a8dc5538aa4d53453cffe52a7e5..5395c9eb65d2a61632ab56ad5ee1704a8679e6e1 100644
--- a/source/RobotAPI/libraries/aron/core/Exception.h
+++ b/source/RobotAPI/libraries/aron/core/Exception.h
@@ -52,6 +52,14 @@ namespace armarx::aron::error
             LocalException(prettymethod + ": " + reason + ". The path was: " + path.toString())
         {
         }
+
+        /// call operator to append a message to the exception. Used by ARMARX_CHECK_AND_THROW
+        AronException& operator()(const std::string& additionalMessage = "")
+        {
+            auto currentReason = getReason();
+            setReason(currentReason + ". Additional Message: " + additionalMessage);
+            return *this;
+        }
     };
 
     /**