diff --git a/vpd-manager/include/utility/json_utility.hpp b/vpd-manager/include/utility/json_utility.hpp
index aeeac9a..852b501 100644
--- a/vpd-manager/include/utility/json_utility.hpp
+++ b/vpd-manager/include/utility/json_utility.hpp
@@ -633,51 +633,47 @@
  *
  * @param[in] i_sysCfgJsonObj - System config JSON object
  * @param[in] i_vpdPath - Path to where VPD is stored.
+ * @param[out] o_errCode - To set error code in case of error.
  *
  * @return On success return valid path, on failure return empty string.
  */
 inline std::string getFruPathFromJson(const nlohmann::json& i_sysCfgJsonObj,
-                                      const std::string& i_vpdPath) noexcept
+                                      const std::string& i_vpdPath,
+                                      uint16_t& o_errCode)
 {
-    try
+    if (i_vpdPath.empty())
     {
-        if (i_vpdPath.empty())
-        {
-            throw std::runtime_error("Path parameter is empty.");
-        }
-
-        if (!i_sysCfgJsonObj.contains("frus"))
-        {
-            throw std::runtime_error("Missing frus tag in system config JSON.");
-        }
-
-        // check if given path is FRU path
-        if (i_sysCfgJsonObj["frus"].contains(i_vpdPath))
-        {
-            return i_vpdPath;
-        }
-
-        const nlohmann::json& l_fruList =
-            i_sysCfgJsonObj["frus"].get_ref<const nlohmann::json::object_t&>();
-
-        for (const auto& l_fru : l_fruList.items())
-        {
-            const auto l_fruPath = l_fru.key();
-
-            // check if given path is redundant FRU path or inventory path
-            if (i_vpdPath == i_sysCfgJsonObj["frus"][l_fruPath].at(0).value(
-                                 "redundantEeprom", "") ||
-                (i_vpdPath == i_sysCfgJsonObj["frus"][l_fruPath].at(0).value(
-                                  "inventoryPath", "")))
-            {
-                return l_fruPath;
-            }
-        }
+        o_errCode = error_code::INVALID_INPUT_PARAMETER;
+        return std::string{};
     }
-    catch (const std::exception& l_ex)
+
+    if (!i_sysCfgJsonObj.contains("frus"))
     {
-        logging::logMessage("Failed to get FRU path from JSON, error: " +
-                            std::string(l_ex.what()));
+        o_errCode = error_code::INVALID_JSON;
+        return std::string{};
+    }
+
+    // check if given path is FRU path
+    if (i_sysCfgJsonObj["frus"].contains(i_vpdPath))
+    {
+        return i_vpdPath;
+    }
+
+    const nlohmann::json& l_fruList =
+        i_sysCfgJsonObj["frus"].get_ref<const nlohmann::json::object_t&>();
+
+    for (const auto& l_fru : l_fruList.items())
+    {
+        const auto l_fruPath = l_fru.key();
+
+        // check if given path is redundant FRU path or inventory path
+        if (i_vpdPath == i_sysCfgJsonObj["frus"][l_fruPath].at(0).value(
+                             "redundantEeprom", "") ||
+            (i_vpdPath == i_sysCfgJsonObj["frus"][l_fruPath].at(0).value(
+                              "inventoryPath", "")))
+        {
+            return l_fruPath;
+        }
     }
 
     return std::string();
@@ -847,27 +843,45 @@
     types::Path l_redundantFruPath;
     try
     {
+        uint16_t l_errCode = 0;
+
         if (!i_sysCfgJsonObj.empty())
         {
             // Get hardware path from system config JSON.
-            const types::Path l_fruPath =
-                jsonUtility::getFruPathFromJson(i_sysCfgJsonObj, io_vpdPath);
+            const types::Path l_fruPath = jsonUtility::getFruPathFromJson(
+                i_sysCfgJsonObj, io_vpdPath, l_errCode);
 
             if (!l_fruPath.empty())
             {
                 io_vpdPath = l_fruPath;
 
-                uint16_t l_errCode = 0;
-
                 // Get inventory object path from system config JSON
                 l_inventoryObjPath = jsonUtility::getInventoryObjPathFromJson(
                     i_sysCfgJsonObj, l_fruPath, l_errCode);
 
+                if (l_errCode)
+                {
+                    logging::logMessage(
+                        "Failed to get inventory path from JSON for [" +
+                        io_vpdPath + "], error : " +
+                        vpdSpecificUtility::getErrCodeMsg(l_errCode));
+
+                    return std::make_tuple(io_vpdPath, l_inventoryObjPath,
+                                           l_redundantFruPath);
+                }
+
                 // Get redundant hardware path if present in system config JSON
                 l_redundantFruPath =
                     jsonUtility::getRedundantEepromPathFromJson(i_sysCfgJsonObj,
                                                                 l_fruPath);
             }
+
+            logging::logMessage(
+                "Failed to get FRU path from JSON for [" + io_vpdPath +
+                "], error : " + vpdSpecificUtility::getErrCodeMsg(l_errCode));
+
+            return std::make_tuple(io_vpdPath, l_inventoryObjPath,
+                                   l_redundantFruPath);
         }
     }
     catch (const std::exception& l_exception)
