diff --git a/vpd-manager/src/bios_handler.cpp b/vpd-manager/src/bios_handler.cpp
index 73dd229..3334f0a 100644
--- a/vpd-manager/src/bios_handler.cpp
+++ b/vpd-manager/src/bios_handler.cpp
@@ -17,51 +17,61 @@
 template class BiosHandler<IbmBiosHandler>;
 
 template <typename T>
-void BiosHandler<T>::checkAndListenPldmService()
+void BiosHandler<T>::checkAndListenPldmService() noexcept
 {
-    // Setup a call back match on NameOwnerChanged to determine when PLDM is up.
-    static std::shared_ptr<sdbusplus::bus::match_t> l_nameOwnerMatch =
-        std::make_shared<sdbusplus::bus::match_t>(
-            *m_asioConn,
-            sdbusplus::bus::match::rules::nameOwnerChanged(
-                constants::pldmServiceName),
-            [this](sdbusplus::message_t& l_msg) {
-                if (l_msg.is_method_error())
-                {
-                    logging::logMessage(
-                        "Error in reading PLDM name owner changed signal.");
-                    return;
-                }
-
-                std::string l_name;
-                std::string l_newOwner;
-                std::string l_oldOwner;
-
-                l_msg.read(l_name, l_oldOwner, l_newOwner);
-
-                if (!l_newOwner.empty() &&
-                    (l_name.compare(constants::pldmServiceName) ==
-                     constants::STR_CMP_SUCCESS))
-                {
-                    m_specificBiosHandler->backUpOrRestoreBiosAttributes();
-
-                    // Start listener now that we have done the restore.
-                    listenBiosAttributes();
-
-                    //  We don't need the match anymore
-                    l_nameOwnerMatch.reset();
-                }
-            });
-
-    // Based on PLDM service status reset owner match registered above and
-    // trigger BIOS attribute sync.
-    if (dbusUtility::isServiceRunning(constants::pldmServiceName))
+    try
     {
-        l_nameOwnerMatch.reset();
-        m_specificBiosHandler->backUpOrRestoreBiosAttributes();
+        // Setup a call back match on NameOwnerChanged to determine when PLDM is
+        // up.
+        static std::shared_ptr<sdbusplus::bus::match_t> l_nameOwnerMatch =
+            std::make_shared<sdbusplus::bus::match_t>(
+                *m_asioConn,
+                sdbusplus::bus::match::rules::nameOwnerChanged(
+                    constants::pldmServiceName),
+                [this](sdbusplus::message_t& l_msg) {
+                    if (l_msg.is_method_error())
+                    {
+                        logging::logMessage(
+                            "Error in reading PLDM name owner changed signal.");
+                        return;
+                    }
 
-        // Start listener now that we have done the restore.
-        listenBiosAttributes();
+                    std::string l_name;
+                    std::string l_newOwner;
+                    std::string l_oldOwner;
+
+                    l_msg.read(l_name, l_oldOwner, l_newOwner);
+
+                    if (!l_newOwner.empty() &&
+                        (l_name.compare(constants::pldmServiceName) ==
+                         constants::STR_CMP_SUCCESS))
+                    {
+                        m_specificBiosHandler->backUpOrRestoreBiosAttributes();
+
+                        // Start listener now that we have done the restore.
+                        listenBiosAttributes();
+
+                        //  We don't need the match anymore
+                        l_nameOwnerMatch.reset();
+                    }
+                });
+
+        // Based on PLDM service status reset owner match registered above and
+        // trigger BIOS attribute sync.
+        if (dbusUtility::isServiceRunning(constants::pldmServiceName))
+        {
+            l_nameOwnerMatch.reset();
+            m_specificBiosHandler->backUpOrRestoreBiosAttributes();
+
+            // Start listener now that we have done the restore.
+            listenBiosAttributes();
+        }
+    }
+    catch (const std::exception& l_ex)
+    {
+        logging::logMessage(
+            "Failed to register callback for PLDM servce. Error: " +
+            std::string(l_ex.what()));
     }
 }
 
diff --git a/vpd-manager/src/manager_main.cpp b/vpd-manager/src/manager_main.cpp
index ab1d374..0f8424f 100644
--- a/vpd-manager/src/manager_main.cpp
+++ b/vpd-manager/src/manager_main.cpp
@@ -35,10 +35,28 @@
         auto vpdManager = std::make_shared<vpd::Manager>(
             io_con, interface, progressInf, connection);
 
-        // TODO: Take this under conditional compilation for IBM
-        auto biosHandler =
-            std::make_shared<vpd::BiosHandler<vpd::IbmBiosHandler>>(
-                connection, vpdManager);
+        try
+        {
+            // TODO: Take this under conditional compilation for IBM
+            auto biosHandler =
+                std::make_shared<vpd::BiosHandler<vpd::IbmBiosHandler>>(
+                    connection, vpdManager);
+            biosHandler->checkAndListenPldmService();
+        }
+        catch (const std::exception& l_ex)
+        {
+            // Cathcing exception here explicitly to let VPD-Manager service
+            // continue even when bios handler fails.
+            const std::string& l_errMsg =
+                "Instantiation of BIOS Handler failed. { " +
+                std::string(l_ex.what()) + std::string(" }");
+
+            vpd::EventLogger::createSyncPel(
+                vpd::types::ErrorType::FirmwareError,
+                vpd::types::SeverityType::Warning, __FILE__, __FUNCTION__, 0,
+                l_errMsg, std::nullopt, std::nullopt, std::nullopt,
+                std::nullopt);
+        }
 
         interface->initialize();
         progressInf->initialize();
