diff --git a/semantic_router/routers/base.py b/semantic_router/routers/base.py
index a2c7f57cd223c57fe8cc341df6fa710acf9b3a65..eff8647a9af901616aec30b37bb9de4eb4522057 100644
--- a/semantic_router/routers/base.py
+++ b/semantic_router/routers/base.py
@@ -590,20 +590,29 @@ class BaseRouter(BaseModel):
             )
             return diff.to_utterance_str()
         # otherwise we continue with the sync, first locking the index
-        _ = self.index.lock(value=True, wait=wait)
-        # first creating a diff
-        local_utterances = self.to_config().to_utterances()
-        remote_utterances = self.index.get_utterances()
-        diff = UtteranceDiff.from_utterances(
-            local_utterances=local_utterances,
-            remote_utterances=remote_utterances,
-        )
-        # generate sync strategy
-        sync_strategy = diff.get_sync_strategy(sync_mode=sync_mode)
-        # and execute
-        self._execute_sync_strategy(sync_strategy)
-        # unlock index after sync
-        _ = self.index.lock(value=False)
+        try:
+            _ = self.index.lock(value=True, wait=wait)
+            try:
+                # first creating a diff
+                local_utterances = self.to_config().to_utterances()
+                remote_utterances = self.index.get_utterances()
+                diff = UtteranceDiff.from_utterances(
+                    local_utterances=local_utterances,
+                    remote_utterances=remote_utterances,
+                )
+                # generate sync strategy
+                sync_strategy = diff.get_sync_strategy(sync_mode=sync_mode)
+                # and execute
+                self._execute_sync_strategy(sync_strategy)
+            except Exception as e:
+                logger.error(f"Failed to create diff: {e}")
+                raise e
+            finally:
+                # unlock index after sync
+                _ = self.index.lock(value=False)
+        except Exception as e:
+            logger.error(f"Failed to lock index for sync: {e}")
+            raise e
         return diff.to_utterance_str()
 
     async def async_sync(
@@ -635,20 +644,29 @@ class BaseRouter(BaseModel):
             )
             return diff.to_utterance_str()
         # otherwise we continue with the sync, first locking the index
-        _ = await self.index.alock(value=True, wait=wait)
-        # first creating a diff
-        local_utterances = self.to_config().to_utterances()
-        remote_utterances = await self.index.aget_utterances()
-        diff = UtteranceDiff.from_utterances(
-            local_utterances=local_utterances,
-            remote_utterances=remote_utterances,
-        )
-        # generate sync strategy
-        sync_strategy = diff.get_sync_strategy(sync_mode=sync_mode)
-        # and execute
-        await self._async_execute_sync_strategy(sync_strategy)
-        # unlock index after sync
-        _ = await self.index.alock(value=False)
+        try:
+            _ = await self.index.alock(value=True, wait=wait)
+            try:
+                # first creating a diff
+                local_utterances = self.to_config().to_utterances()
+                remote_utterances = await self.index.aget_utterances()
+                diff = UtteranceDiff.from_utterances(
+                    local_utterances=local_utterances,
+                    remote_utterances=remote_utterances,
+                )
+                # generate sync strategy
+                sync_strategy = diff.get_sync_strategy(sync_mode=sync_mode)
+                # and execute
+                await self._async_execute_sync_strategy(sync_strategy)
+            except Exception as e:
+                logger.error(f"Failed to create diff: {e}")
+                raise e
+            finally:
+                # unlock index after sync
+                _ = await self.index.alock(value=False)
+        except Exception as e:
+            logger.error(f"Failed to lock index for sync: {e}")
+            raise e
         return diff.to_utterance_str()
 
     def _execute_sync_strategy(self, strategy: Dict[str, Dict[str, List[Utterance]]]):