diff --git a/vpd-manager/include/utility/vpd_specific_utility.hpp b/vpd-manager/include/utility/vpd_specific_utility.hpp
index 09c4719..fbf713b 100644
--- a/vpd-manager/include/utility/vpd_specific_utility.hpp
+++ b/vpd-manager/include/utility/vpd_specific_utility.hpp
@@ -135,29 +135,40 @@
 /**
  * @brief An API to read value of a keyword.
  *
- * Note: Throws exception. Caller needs to handle.
  *
- * @param[in] kwdValueMap - A map having Kwd value pair.
- * @param[in] kwd - keyword name.
- * @param[out] kwdValue - Value of the keyword read from map.
+ * @param[in] i_kwdValueMap - A map having Kwd value pair.
+ * @param[in] i_kwd - keyword name.
+ *
+ * @return On success returns value of the keyword read from map, otherwise
+ * returns empty string.
  */
-inline void getKwVal(const types::IPZKwdValueMap& kwdValueMap,
-                     const std::string& kwd, std::string& kwdValue)
+inline std::string getKwVal(const types::IPZKwdValueMap& i_kwdValueMap,
+                            const std::string& i_kwd) noexcept
 {
-    if (kwd.empty())
+    std::string l_kwdValue;
+    try
     {
-        logging::logMessage("Invalid parameters");
-        throw std::runtime_error("Invalid parameters");
-    }
+        if (i_kwd.empty())
+        {
+            throw std::runtime_error("Invalid parameters");
+        }
 
-    auto itrToKwd = kwdValueMap.find(kwd);
-    if (itrToKwd != kwdValueMap.end())
+        auto l_itrToKwd = i_kwdValueMap.find(i_kwd);
+        if (l_itrToKwd != i_kwdValueMap.end())
+        {
+            l_kwdValue = l_itrToKwd->second;
+        }
+        else
+        {
+            throw std::runtime_error("Keyword not found");
+        }
+    }
+    catch (const std::exception& l_ex)
     {
-        kwdValue = itrToKwd->second;
-        return;
+        logging::logMessage("Failed to get value for keyword [" + i_kwd +
+                            "]. Error : " + l_ex.what());
     }
-
-    throw std::runtime_error("Keyword not found");
+    return l_kwdValue;
 }
 
 /**
@@ -321,9 +332,19 @@
             ipzVpdMap && (*ipzVpdMap).find(recordName) != (*ipzVpdMap).end())
         {
             auto itrToVCEN = (*ipzVpdMap).find(recordName);
-            // The exceptions will be cautght at end.
-            getKwVal(itrToVCEN->second, kwd1, firstKwdValue);
-            getKwVal(itrToVCEN->second, kwd2, secondKwdValue);
+            firstKwdValue = getKwVal(itrToVCEN->second, kwd1);
+            if (firstKwdValue.empty())
+            {
+                throw std::runtime_error(
+                    "Failed to get value for keyword [" + kwd1 + "]");
+            }
+
+            secondKwdValue = getKwVal(itrToVCEN->second, kwd2);
+            if (secondKwdValue.empty())
+            {
+                throw std::runtime_error(
+                    "Failed to get value for keyword [" + kwd2 + "]");
+            }
         }
         else
         {
@@ -488,9 +509,8 @@
                     "VINI record not found in parsed VPD. Can't find CCIN");
             }
 
-            std::string l_ccinFromVpd;
-            vpdSpecificUtility::getKwVal(l_itrToRec->second, "CC",
-                                         l_ccinFromVpd);
+            std::string l_ccinFromVpd{
+                vpdSpecificUtility::getKwVal(l_itrToRec->second, "CC")};
             if (l_ccinFromVpd.empty())
             {
                 throw DataException(
diff --git a/vpd-manager/src/backup_restore.cpp b/vpd-manager/src/backup_restore.cpp
index 9de43b9..e275ea2 100644
--- a/vpd-manager/src/backup_restore.cpp
+++ b/vpd-manager/src/backup_restore.cpp
@@ -244,8 +244,16 @@
         std::string l_srcStrValue;
         if (!io_srcVpdMap.empty())
         {
-            vpdSpecificUtility::getKwVal(io_srcVpdMap.at(l_srcRecordName),
-                                         l_srcKeywordName, l_srcStrValue);
+            l_srcStrValue = vpdSpecificUtility::getKwVal(
+                io_srcVpdMap.at(l_srcRecordName), l_srcKeywordName);
+
+            if (l_srcStrValue.empty())
+            {
+                std::runtime_error(
+                    std::string("Failed to get value for keyword [") +
+                    l_srcKeywordName + std::string("]"));
+            }
+
             l_srcBinaryValue =
                 types::BinaryVector(l_srcStrValue.begin(), l_srcStrValue.end());
         }
@@ -268,8 +276,16 @@
         std::string l_dstStrValue;
         if (!io_dstVpdMap.empty())
         {
-            vpdSpecificUtility::getKwVal(io_dstVpdMap.at(l_dstRecordName),
-                                         l_dstKeywordName, l_dstStrValue);
+            l_dstStrValue = vpdSpecificUtility::getKwVal(
+                io_dstVpdMap.at(l_dstRecordName), l_dstKeywordName);
+
+            if (l_dstStrValue.empty())
+            {
+                std::runtime_error(
+                    std::string("Failed to get value for keyword [") +
+                    l_dstKeywordName + std::string("]"));
+            }
+
             l_dstBinaryValue =
                 types::BinaryVector(l_dstStrValue.begin(), l_dstStrValue.end());
         }
diff --git a/vpd-manager/src/worker.cpp b/vpd-manager/src/worker.cpp
index 1529924..4bd61bf 100644
--- a/vpd-manager/src/worker.cpp
+++ b/vpd-manager/src/worker.cpp
@@ -931,9 +931,9 @@
                 return;
             }
 
-            std::string pgKeywordValue;
-            vpdSpecificUtility::getKwVal(itrToRec->second, "PG",
-                                         pgKeywordValue);
+            const std::string pgKeywordValue{
+                vpdSpecificUtility::getKwVal(itrToRec->second, "PG")};
+
             if (!pgKeywordValue.empty())
             {
                 if (isCPUIOGoodOnly(pgKeywordValue))
@@ -942,6 +942,10 @@
                               ["PrettyName"] = "IO Module";
                 }
             }
+            else
+            {
+                throw std::runtime_error("Failed to get value for keyword PG");
+            }
         }
     }
 }
@@ -999,8 +1003,9 @@
             return false;
         }
 
-        std::string ccinFromVpd;
-        vpdSpecificUtility::getKwVal(itrToRec->second, "CC", ccinFromVpd);
+        std::string ccinFromVpd{
+            vpdSpecificUtility::getKwVal(itrToRec->second, "CC")};
+
         if (ccinFromVpd.empty())
         {
             return false;
@@ -1187,13 +1192,27 @@
         auto l_itrToVsys = (*l_parsedVpdMap).find(constants::recVSYS);
         if (l_itrToVsys != (*l_parsedVpdMap).end())
         {
-            std::string l_tmKwdValue;
-            vpdSpecificUtility::getKwVal(l_itrToVsys->second, constants::kwdTM,
-                                         l_tmKwdValue);
+            const std::string l_tmKwdValue{vpdSpecificUtility::getKwVal(
+                l_itrToVsys->second, constants::kwdTM)};
 
-            std::string l_seKwdValue;
-            vpdSpecificUtility::getKwVal(l_itrToVsys->second, constants::kwdSE,
-                                         l_seKwdValue);
+            if (l_tmKwdValue.empty())
+            {
+                throw std::runtime_error(
+                    std::string("Failed to get value for keyword [") +
+                    constants::kwdTM +
+                    std::string("] while creating Asset tag."));
+            }
+
+            const std::string l_seKwdValue{vpdSpecificUtility::getKwVal(
+                l_itrToVsys->second, constants::kwdSE)};
+
+            if (l_seKwdValue.empty())
+            {
+                throw std::runtime_error(
+                    std::string("Failed to get value for keyword [") +
+                    constants::kwdSE +
+                    std::string("] while creating Asset tag."));
+            }
 
             l_assetTag = std::string{"Server-"} + l_tmKwdValue +
                          std::string{"-"} + l_seKwdValue;
