diff --git a/libpldmresponder/bios.cpp b/libpldmresponder/bios.cpp
index 61b5e49..3f379cb 100644
--- a/libpldmresponder/bios.cpp
+++ b/libpldmresponder/bios.cpp
@@ -299,59 +299,6 @@
     return response;
 }
 
-/** @brief Find the string handle from the BIOS string table given the name
- *
- *  @param[in] name - name of the BIOS string
- *  @param[in] biosStringTable - the string table
- *  @return - uint16_t - handle of the string
- */
-StringHandle findStringHandle(const std::string& name,
-                              const BIOSTable& biosStringTable)
-{
-    Table table;
-    biosStringTable.load(table);
-    auto stringEntry = pldm_bios_table_string_find_by_string(
-        table.data(), table.size(), name.c_str());
-    if (stringEntry == nullptr)
-    {
-        std::cerr << "Reached end of BIOS string table,did not find the "
-                  << "handle for the string, STRING=" << name.c_str() << "\n";
-        throw InternalFailure();
-    }
-
-    return pldm_bios_table_string_entry_decode_handle(stringEntry);
-}
-
-/** @brief Find the string name from the BIOS string table for a string handle
- *
- *  @param[in] stringHdl - string handle
- *  @param[in] biosStringTable - the string table
- *
- *  @return - std::string - name of the corresponding BIOS string
- */
-std::string findStringName(StringHandle stringHdl,
-                           const BIOSTable& biosStringTable)
-{
-    Table table;
-    biosStringTable.load(table);
-    auto stringEntry = pldm_bios_table_string_find_by_handle(
-        table.data(), table.size(), stringHdl);
-    if (stringEntry == nullptr)
-    {
-        std::cerr << "Reached end of BIOS string table,did not find "
-                  << "string name for handle, STRING_HANDLE=" << stringHdl
-                  << "\n";
-        throw InternalFailure();
-    }
-    auto strLength =
-        pldm_bios_table_string_entry_decode_string_length(stringEntry);
-    std::vector<char> buffer(strLength + 1);
-    pldm_bios_table_string_entry_decode_string(stringEntry, buffer.data(),
-                                               buffer.size());
-
-    return std::string(buffer.data(), buffer.data() + strLength);
-}
-
 namespace bios_type_enum
 {
 
@@ -371,7 +318,7 @@
  */
 std::vector<uint8_t> findStrIndices(PossibleValuesByHandle possiVals,
                                     CurrentValues currVals,
-                                    const BIOSTable& biosStringTable)
+                                    const BIOSStringTable& biosStringTable)
 {
     std::vector<uint8_t> stringIndices;
 
@@ -380,9 +327,9 @@
         StringHandle curHdl;
         try
         {
-            curHdl = findStringHandle(currVal, biosStringTable);
+            curHdl = biosStringTable.findHandle(currVal);
         }
-        catch (InternalFailure& e)
+        catch (const std::exception& e)
         {
             std::cerr << "Exception fetching handle for the string, STRING="
                       << currVal.c_str() << "\n";
@@ -437,7 +384,8 @@
  *  @param[in,out] attributeTable - the attribute table
  *
  */
-void constructAttrTable(const BIOSTable& biosStringTable, Table& attributeTable)
+void constructAttrTable(const BIOSStringTable& biosStringTable,
+                        Table& attributeTable)
 {
     const auto& attributeMap = getValues();
     StringHandle strHandle;
@@ -446,9 +394,9 @@
     {
         try
         {
-            strHandle = findStringHandle(key, biosStringTable);
+            strHandle = biosStringTable.findHandle(key);
         }
-        catch (InternalFailure& e)
+        catch (const std::exception& e)
         {
             std::cerr << "Could not find handle for BIOS string, ATTRIBUTE="
                       << key.c_str() << "\n";
@@ -463,10 +411,10 @@
         {
             try
             {
-                auto hdl = findStringHandle(elem, biosStringTable);
+                auto hdl = biosStringTable.findHandle(elem);
                 possiValsByHdl.push_back(std::move(hdl));
             }
-            catch (InternalFailure& e)
+            catch (const std::exception& e)
             {
                 std::cerr << "Could not find handle for BIOS string, STRING="
                           << elem.c_str() << "\n";
@@ -494,7 +442,7 @@
 
 void constructAttrValueEntry(
     const struct pldm_bios_attr_table_entry* attrTableEntry,
-    const std::string& attrName, const BIOSTable& biosStringTable,
+    const std::string& attrName, const BIOSStringTable& biosStringTable,
     Table& attrValueTable)
 {
     CurrentValues currVals;
@@ -541,7 +489,8 @@
  *  @param[in,out] attributeTable - the attribute table
  *
  */
-void constructAttrTable(const BIOSTable& biosStringTable, Table& attributeTable)
+void constructAttrTable(const BIOSStringTable& biosStringTable,
+                        Table& attributeTable)
 {
     const auto& attributeMap = getValues();
     StringHandle strHandle;
@@ -549,9 +498,9 @@
     {
         try
         {
-            strHandle = findStringHandle(key, biosStringTable);
+            strHandle = biosStringTable.findHandle(key);
         }
-        catch (InternalFailure& e)
+        catch (const std::exception& e)
         {
             std::cerr << "Could not find handle for BIOS string, ATTRIBUTE="
                       << key.c_str() << "\n";
@@ -576,7 +525,7 @@
 
 void constructAttrValueEntry(const pldm_bios_attr_table_entry* attrTableEntry,
                              const std::string& attrName,
-                             const BIOSTable& biosStringTable,
+                             const BIOSStringTable& biosStringTable,
                              Table& attrValueTable)
 {
     std::ignore = biosStringTable;
@@ -616,7 +565,8 @@
  *  @param[in,out] attributeTable - the attribute table
  *
  */
-void constructAttrTable(const BIOSTable& biosStringTable, Table& attributeTable)
+void constructAttrTable(const BIOSStringTable& biosStringTable,
+                        Table& attributeTable)
 {
     const auto& attributeMap = getValues();
     StringHandle strHandle;
@@ -624,9 +574,9 @@
     {
         try
         {
-            strHandle = findStringHandle(key, biosStringTable);
+            strHandle = biosStringTable.findHandle(key);
         }
-        catch (InternalFailure& e)
+        catch (const std::exception& e)
         {
             std::cerr << "Could not find handle for BIOS string, ATTRIBUTE="
                       << key.c_str() << "\n";
@@ -650,7 +600,7 @@
 
 void constructAttrValueEntry(const pldm_bios_attr_table_entry* attrTableEntry,
                              const std::string& attrName,
-                             const BIOSTable& biosStringTable,
+                             const BIOSStringTable& biosStringTable,
                              Table& attrValueTable)
 {
     std::ignore = biosStringTable;
@@ -699,7 +649,7 @@
     }
 }
 
-using typeHandler = std::function<void(const BIOSTable& biosStringTable,
+using typeHandler = std::function<void(const BIOSStringTable& biosStringTable,
                                        Table& attributeTable)>;
 std::map<BIOSJsonName, typeHandler> attrTypeHandlers{
     {bios_parser::bIOSEnumJson, bios_type_enum::constructAttrTable},
@@ -715,7 +665,7 @@
  *  @param[in] request - Request message
  */
 Response getBIOSAttributeTable(BIOSTable& biosAttributeTable,
-                               const BIOSTable& biosStringTable,
+                               const BIOSStringTable& biosStringTable,
                                const char* biosJsonDir, const pldm_msg* request)
 {
     Response response(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES,
@@ -778,7 +728,7 @@
 using AttrValTableEntryConstructHandler =
     std::function<void(const struct pldm_bios_attr_table_entry* tableEntry,
                        const std::string& attrName,
-                       const BIOSTable& biosStringTable, Table& table)>;
+                       const BIOSStringTable& biosStringTable, Table& table)>;
 
 using AttrType = uint8_t;
 const std::map<AttrType, AttrValTableEntryConstructHandler>
@@ -795,18 +745,21 @@
 
 void constructAttrValueTableEntry(
     const struct pldm_bios_attr_table_entry* attrEntry,
-    const BIOSTable& biosStringTable, Table& attributeValueTable)
+    const BIOSStringTable& biosStringTable, Table& attributeValueTable)
 {
-    auto attrName = findStringName(attrEntry->string_handle, biosStringTable);
-    if (attrName.empty())
+    auto stringHandle =
+        pldm_bios_table_attr_entry_decode_string_handle(attrEntry);
+    try
     {
-        std::cerr << "invalid string handle, STRING_HANDLE="
-                  << attrEntry->string_handle << "\n";
-        return;
+        auto attrName = biosStringTable.findString(stringHandle);
+        AttrValTableConstructMap.at(attrEntry->attr_type)(
+            attrEntry, attrName, biosStringTable, attributeValueTable);
     }
-
-    AttrValTableConstructMap.at(attrEntry->attr_type)(
-        attrEntry, attrName, biosStringTable, attributeValueTable);
+    catch (const std::exception& e)
+    {
+        std::cerr << "constructAttrValueTableEntry Error: " << e.what()
+                  << std::endl;
+    }
 }
 
 /** @brief Construct the BIOS attribute value table
@@ -818,7 +771,7 @@
  */
 Response getBIOSAttributeValueTable(BIOSTable& biosAttributeValueTable,
                                     const BIOSTable& biosAttributeTable,
-                                    const BIOSTable& biosStringTable,
+                                    const BIOSStringTable& biosStringTable,
                                     const pldm_msg* request)
 {
     Response response(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES,
diff --git a/libpldmresponder/bios_table.cpp b/libpldmresponder/bios_table.cpp
index cf1ec77..9b7dd49 100644
--- a/libpldmresponder/bios_table.cpp
+++ b/libpldmresponder/bios_table.cpp
@@ -46,12 +46,14 @@
     stream.read(reinterpret_cast<char*>(response.data() + currSize), fileSize);
 }
 
-BIOSStringTable::BIOSStringTable(const char* filePath) : BIOSTable(filePath)
+BIOSStringTable::BIOSStringTable(const Table& stringTable) :
+    stringTable(stringTable)
 {
-    if (!isEmpty())
-    {
-        load(stringTable);
-    }
+}
+
+BIOSStringTable::BIOSStringTable(const BIOSTable& biosTable)
+{
+    biosTable.load(stringTable);
 }
 
 std::string BIOSStringTable::findString(uint16_t handle) const
@@ -71,6 +73,18 @@
     return std::string(buffer.data(), buffer.data() + strLength);
 }
 
+uint16_t BIOSStringTable::findHandle(const std::string& name) const
+{
+    auto stringEntry = pldm_bios_table_string_find_by_string(
+        stringTable.data(), stringTable.size(), name.c_str());
+    if (stringEntry == nullptr)
+    {
+        throw std::invalid_argument("Invalid String Name");
+    }
+
+    return pldm_bios_table_string_entry_decode_handle(stringEntry);
+}
+
 } // namespace bios
 } // namespace responder
 } // namespace pldm
diff --git a/libpldmresponder/bios_table.hpp b/libpldmresponder/bios_table.hpp
index b99b7a6..67503df 100644
--- a/libpldmresponder/bios_table.hpp
+++ b/libpldmresponder/bios_table.hpp
@@ -71,22 +71,37 @@
     fs::path filePath;
 };
 
-class BIOSStringTable : public BIOSTable
+class BIOSStringTable
 {
   public:
-    /** @brief Ctor - set file path to persist BIOS String table
+    /** @brief Constructs BIOSStringTable
      *
-     *  @param[in] filePath - file where BIOS table should be persisted
+     *  @param[in] stringTable - The stringTable in RAM
      */
-    BIOSStringTable(const char* filePath);
+    BIOSStringTable(const Table& stringTable);
+
+    /** @brief Constructs BIOSStringTable
+     *
+     *  @param[in] biosTable - The BIOSTable
+     */
+    BIOSStringTable(const BIOSTable& biosTable);
 
     /** @brief Find the string name from the BIOS string table for a string
      * handle
      *  @param[in] handle - string handle
-     *  @return - std::string - name of the corresponding BIOS string
+     *  @return name of the corresponding BIOS string
+     *  @throw std::invalid_argument if the string can not be found.
      */
     std::string findString(uint16_t handle) const;
 
+    /** @brief Find the string handle from the BIOS string table by the given
+     *         name
+     *  @param[in] name - name of the BIOS string
+     *  @return handle of the string
+     *  @throw std::invalid_argument if the string can not be found
+     */
+    uint16_t findHandle(const std::string& name) const;
+
   private:
     Table stringTable;
 };
