diff --git a/download_manager.cpp b/download_manager.cpp
index 972278b..fdffcb9 100644
--- a/download_manager.cpp
+++ b/download_manager.cpp
@@ -15,6 +15,7 @@
 #include <filesystem>
 #include <iostream>
 #include <string>
+#include <system_error>
 
 namespace phosphor
 {
@@ -61,9 +62,11 @@
 
     // Check if IMAGE DIR exists
     fs::path imgDirPath(IMG_UPLOAD_DIR);
-    if (!fs::is_directory(imgDirPath))
+    std::error_code ec;
+    if (!fs::is_directory(imgDirPath, ec))
     {
-        error("Image Dir {PATH} does not exist", "PATH", imgDirPath);
+        error("Image Dir {PATH} does not exist: {ERROR_MSG}", "PATH",
+              imgDirPath, "ERROR_MSG", ec.message());
         elog<InternalFailure>();
         return;
     }
diff --git a/image_manager.cpp b/image_manager.cpp
index eb4fec4..f998871 100644
--- a/image_manager.cpp
+++ b/image_manager.cpp
@@ -22,6 +22,7 @@
 #include <filesystem>
 #include <random>
 #include <string>
+#include <system_error>
 
 namespace phosphor
 {
@@ -76,9 +77,11 @@
 
 int Manager::processImage(const std::string& tarFilePath)
 {
-    if (!fs::is_regular_file(tarFilePath))
+    std::error_code ec;
+    if (!fs::is_regular_file(tarFilePath, ec))
     {
-        error("Tarball {PATH} does not exist", "PATH", tarFilePath);
+        error("Tarball {PATH} does not exist: {ERROR_MSG}", "PATH", tarFilePath,
+              "ERROR_MSG", ec.message());
         report<ManifestFileFailure>(ManifestFail::PATH(tarFilePath.c_str()));
         return -1;
     }
@@ -109,9 +112,10 @@
     }
 
     // Verify the manifest file
-    if (!fs::is_regular_file(manifestPath))
+    if (!fs::is_regular_file(manifestPath, ec))
     {
-        error("No manifest file {PATH}", "PATH", tarFilePath);
+        error("No manifest file {PATH}: {ERROR_MSG}", "PATH", tarFilePath,
+              "ERROR_MSG", ec.message());
         report<ManifestFileFailure>(ManifestFail::PATH(tarFilePath.c_str()));
         return -1;
     }
@@ -210,7 +214,7 @@
     if (versions.find(id) == versions.end() && it == allSoftwareObjs.end())
     {
         // Rename the temp dir to image dir
-        fs::rename(tmpDirPath, imageDirPath);
+        fs::rename(tmpDirPath, imageDirPath, ec);
         // Clear the path, so it does not attemp to remove a non-existing path
         tmpDirToRemove.path.clear();
 
@@ -242,9 +246,10 @@
 
     // Delete image dir
     fs::path imageDirPath = (*(it->second)).path();
-    if (fs::exists(imageDirPath))
+    std::error_code ec;
+    if (fs::exists(imageDirPath, ec))
     {
-        fs::remove_all(imageDirPath);
+        fs::remove_all(imageDirPath, ec);
     }
     this->versions.erase(entryId);
 }
diff --git a/image_verify.cpp b/image_verify.cpp
index 9551e4e..2b20340 100644
--- a/image_verify.cpp
+++ b/image_verify.cpp
@@ -18,6 +18,7 @@
 #include <cassert>
 #include <fstream>
 #include <set>
+#include <system_error>
 
 namespace phosphor
 {
@@ -57,9 +58,11 @@
     AvailableKeyTypes keyTypes{};
 
     // Find the path of all the files
-    if (!fs::is_directory(signedConfPath))
+    std::error_code ec;
+    if (!fs::is_directory(signedConfPath, ec))
     {
-        error("Signed configuration path not found in the system");
+        error("Signed configuration path not found in the system: {ERROR_MSG}",
+              "ERROR_MSG", ec.message());
         elog<InternalFailure>();
     }
 
@@ -129,7 +132,9 @@
     fs::path publicKeyFile(imageDirPath / PUBLICKEY_FILE_NAME);
 
     ret = verifyFile(pkeyFullFile, pkeyFullFileSig, publicKeyFile, hashType);
-    fs::remove(tmpFullFile);
+
+    std::error_code ec;
+    fs::remove(tmpFullFile, ec);
 #endif
 
     return ret;
@@ -186,7 +191,8 @@
             fs::path file(imageDirPath);
             file /= optionalImage;
 
-            if (fs::exists(file))
+            std::error_code ec;
+            if (fs::exists(file, ec))
             {
                 optionalFilesFound = true;
                 // Build Signature File name
@@ -297,10 +303,11 @@
 {
 
     // Check existence of the files in the system.
-    if (!(fs::exists(file) && fs::exists(sigFile)))
+    std::error_code ec;
+    if (!(fs::exists(file, ec) && fs::exists(sigFile, ec)))
     {
-        error("Failed to find the Data or signature file {PATH}.", "PATH",
-              file);
+        error("Failed to find the Data or signature file {PATH}: {ERROR_MSG}",
+              "PATH", file, "ERROR_MSG", ec.message());
         elog<InternalFailure>();
     }
 
@@ -338,7 +345,7 @@
     }
 
     // Hash the data file and update the verification context
-    auto size = fs::file_size(file);
+    auto size = fs::file_size(file, ec);
     auto dataPtr = mapFile(file, size);
 
     result = EVP_DigestVerifyUpdate(rsaVerifyCtx.get(), dataPtr(), size);
@@ -350,7 +357,7 @@
     }
 
     // Verify the data with signature.
-    size = fs::file_size(sigFile);
+    size = fs::file_size(sigFile, ec);
     auto signature = mapFile(sigFile, size);
 
     result = EVP_DigestVerifyFinal(
@@ -376,7 +383,8 @@
 
 inline EVP_PKEY_Ptr Signature::createPublicRSA(const fs::path& publicKey)
 {
-    auto size = fs::file_size(publicKey);
+    std::error_code ec;
+    auto size = fs::file_size(publicKey, ec);
 
     // Read public key file
     auto data = mapFile(publicKey, size);
@@ -414,7 +422,8 @@
         fs::path file(filePath);
         file /= bmcImage;
 
-        if (!fs::exists(file))
+        std::error_code ec;
+        if (!fs::exists(file, ec))
         {
             valid = false;
             break;
diff --git a/item_updater.cpp b/item_updater.cpp
index 2fdbc31..3ea954c 100644
--- a/item_updater.cpp
+++ b/item_updater.cpp
@@ -19,6 +19,7 @@
 #include <queue>
 #include <set>
 #include <string>
+#include <system_error>
 
 namespace phosphor
 {
@@ -194,7 +195,8 @@
 
     // Read os-release from folders under /media/ to get
     // BMC Software Versions.
-    for (const auto& iter : fs::directory_iterator(MEDIA_DIR))
+    std::error_code ec;
+    for (const auto& iter : fs::directory_iterator(MEDIA_DIR, ec))
     {
         auto activationState = server::Activation::Activations::Active;
         static const auto BMC_RO_PREFIX_LEN = strlen(BMC_ROFS_PREFIX);
@@ -206,14 +208,16 @@
             // Get the version to calculate the id
             fs::path releaseFile(OS_RELEASE_FILE);
             auto osRelease = iter.path() / releaseFile.relative_path();
-            if (!fs::is_regular_file(osRelease))
+            if (!fs::is_regular_file(osRelease, ec))
             {
 #ifdef BMC_STATIC_DUAL_IMAGE
                 // For dual image, it is possible that the secondary image is
                 // empty or contains invalid data, ignore such case.
-                info("Unable to find osRelease: {PATH}", "PATH", osRelease);
+                info("Unable to find osRelease: {PATH}: {ERROR_MSG}", "PATH",
+                     osRelease, "ERROR_MSG", ec.message());
 #else
-                error("Failed to read osRelease: {PATH}", "PATH", osRelease);
+                error("Failed to read osRelease: {PATH}: {ERROR_MSG}", "PATH",
+                      osRelease, "ERROR_MSG", ec.message());
 
                 // Try to get the version id from the mount directory name and
                 // call to delete it as this version may be corrupted. Dynamic
diff --git a/serialize.cpp b/serialize.cpp
index 8b7fca4..ff9e832 100644
--- a/serialize.cpp
+++ b/serialize.cpp
@@ -8,6 +8,7 @@
 
 #include <filesystem>
 #include <fstream>
+#include <system_error>
 
 namespace phosphor
 {
@@ -24,16 +25,17 @@
 
 void storePriority(const std::string& flashId, uint8_t priority)
 {
+    std::error_code ec;
     auto path = fs::path(PERSIST_DIR) / flashId;
-    if (!fs::is_directory(path))
+    if (!fs::is_directory(path, ec))
     {
-        if (fs::exists(path))
+        if (fs::exists(path, ec))
         {
             // Delete if it's a non-directory file
             warning("Removing non-directory file: {PATH}", "PATH", path);
-            fs::remove_all(path);
+            fs::remove_all(path, ec);
         }
-        fs::create_directories(path);
+        fs::create_directories(path, ec);
     }
     path = path / priorityName;
 
@@ -44,16 +46,17 @@
 
 void storePurpose(const std::string& flashId, VersionPurpose purpose)
 {
+    std::error_code ec;
     auto path = fs::path(PERSIST_DIR) / flashId;
-    if (!fs::is_directory(path))
+    if (!fs::is_directory(path, ec))
     {
-        if (fs::exists(path))
+        if (fs::exists(path, ec))
         {
             // Delete if it's a non-directory file
             warning("Removing non-directory file: {PATH}", "PATH", path);
-            fs::remove_all(path);
+            fs::remove_all(path, ec);
         }
-        fs::create_directories(path);
+        fs::create_directories(path, ec);
     }
     path = path / purposeName;
 
@@ -64,8 +67,9 @@
 
 bool restorePriority(const std::string& flashId, uint8_t& priority)
 {
+    std::error_code ec;
     auto path = fs::path(PERSIST_DIR) / flashId / priorityName;
-    if (fs::exists(path))
+    if (fs::exists(path, ec))
     {
         std::ifstream is(path.c_str(), std::ios::in);
         try
@@ -76,7 +80,7 @@
         }
         catch (const cereal::Exception& e)
         {
-            fs::remove_all(path);
+            fs::remove_all(path, ec);
         }
     }
 
@@ -124,8 +128,9 @@
 
 bool restorePurpose(const std::string& flashId, VersionPurpose& purpose)
 {
+    std::error_code ec;
     auto path = fs::path(PERSIST_DIR) / flashId / purposeName;
-    if (fs::exists(path))
+    if (fs::exists(path, ec))
     {
         std::ifstream is(path.c_str(), std::ios::in);
         try
@@ -136,7 +141,7 @@
         }
         catch (const cereal::Exception& e)
         {
-            fs::remove_all(path);
+            fs::remove_all(path, ec);
         }
     }
 
@@ -145,10 +150,11 @@
 
 void removePersistDataDirectory(const std::string& flashId)
 {
+    std::error_code ec;
     auto path = fs::path(PERSIST_DIR) / flashId;
-    if (fs::exists(path))
+    if (fs::exists(path, ec))
     {
-        fs::remove_all(path);
+        fs::remove_all(path, ec);
     }
 }
 
diff --git a/static/flash.cpp b/static/flash.cpp
index cdf0683..74316d1 100644
--- a/static/flash.cpp
+++ b/static/flash.cpp
@@ -9,6 +9,7 @@
 #include <phosphor-logging/lg2.hpp>
 
 #include <filesystem>
+#include <system_error>
 
 namespace
 {
@@ -52,8 +53,9 @@
 
     for (const auto& bmcImage : parent.imageUpdateList)
     {
+        std::error_code ec;
         fs::copy_file(uploadDir / versionId / bmcImage, toPath / bmcImage,
-                      fs::copy_options::overwrite_existing);
+                      fs::copy_options::overwrite_existing, ec);
     }
 }
 
diff --git a/sync_manager.cpp b/sync_manager.cpp
index 1a3e0dd..caafae0 100644
--- a/sync_manager.cpp
+++ b/sync_manager.cpp
@@ -9,6 +9,7 @@
 #include <phosphor-logging/lg2.hpp>
 
 #include <filesystem>
+#include <system_error>
 
 namespace phosphor
 {
@@ -34,18 +35,19 @@
         // so need to differentiate between the different file events.
         if (mask & IN_CLOSE_WRITE)
         {
-            if (!(fs::exists(dst)))
+            std::error_code ec;
+            if (!(fs::exists(dst, ec)))
             {
-                if (fs::is_directory(entryPath))
+                if (fs::is_directory(entryPath, ec))
                 {
                     // Source is a directory, create it at the destination.
-                    fs::create_directories(dst);
+                    fs::create_directories(dst, ec);
                 }
                 else
                 {
                     // Source is a file, create the directory where this file
                     // resides at the destination.
-                    fs::create_directories(dst.parent_path());
+                    fs::create_directories(dst.parent_path(), ec);
                 }
             }
 
diff --git a/sync_watch.cpp b/sync_watch.cpp
index e84d061..ecf6cef 100644
--- a/sync_watch.cpp
+++ b/sync_watch.cpp
@@ -9,6 +9,7 @@
 
 #include <filesystem>
 #include <fstream>
+#include <system_error>
 
 namespace phosphor
 {
@@ -53,8 +54,9 @@
         return;
     }
 
+    std::error_code ec;
     auto syncfile = fs::path(SYNC_LIST_DIR_PATH) / SYNC_LIST_FILE_NAME;
-    if (fs::exists(syncfile))
+    if (fs::exists(syncfile, ec))
     {
         std::string line;
         std::ifstream file(syncfile.c_str());
@@ -98,7 +100,8 @@
         // Watch was removed, re-add it if file still exists.
         if (event->mask & IN_IGNORED)
         {
-            if (fs::exists(syncWatch->fileMap[event->wd]))
+            std::error_code ec;
+            if (fs::exists(syncWatch->fileMap[event->wd], ec))
             {
                 syncWatch->addInotifyWatch(syncWatch->fileMap[event->wd]);
             }
diff --git a/usb/usb_manager.cpp b/usb/usb_manager.cpp
index 196ab42..226a578 100644
--- a/usb/usb_manager.cpp
+++ b/usb/usb_manager.cpp
@@ -4,6 +4,8 @@
 
 #include <sys/mount.h>
 
+#include <system_error>
+
 namespace phosphor
 {
 namespace usb
@@ -11,8 +13,9 @@
 
 bool USBManager::run()
 {
+    std::error_code ec;
     fs::path dir(usbPath);
-    fs::create_directories(dir);
+    fs::create_directories(dir, ec);
 
     auto rc = mount(devicePath.c_str(), usbPath.c_str(), "vfat", 0, NULL);
     if (rc)
@@ -27,7 +30,7 @@
         if (p.path().extension() == ".tar")
         {
             fs::path dstPath{IMG_UPLOAD_DIR / p.path().filename()};
-            if (fs::exists(dstPath))
+            if (fs::exists(dstPath, ec))
             {
                 lg2::info(
                     "{DSTPATH} already exists in the /tmp/images directory, exit the upgrade",
diff --git a/watch.cpp b/watch.cpp
index 38887d4..cabfd79 100644
--- a/watch.cpp
+++ b/watch.cpp
@@ -14,6 +14,7 @@
 #include <filesystem>
 #include <stdexcept>
 #include <string>
+#include <system_error>
 
 namespace phosphor
 {
@@ -30,10 +31,11 @@
     imageCallback(imageCallback)
 {
     // Check if IMAGE DIR exists.
+    std::error_code ec;
     fs::path imgDirPath(IMG_UPLOAD_DIR);
-    if (!fs::is_directory(imgDirPath))
+    if (!fs::is_directory(imgDirPath, ec))
     {
-        fs::create_directories(imgDirPath);
+        fs::create_directories(imgDirPath, ec);
     }
 
     fd = inotify_init1(IN_NONBLOCK);
