diff --git a/src/traft/rpc/cas.rs b/src/traft/rpc/cas.rs
index cffc9e811c4941acd869307faff534248c668028..0b0b01d427f8728bc1bd3af8b2f3b0923f240ec9 100644
--- a/src/traft/rpc/cas.rs
+++ b/src/traft/rpc/cas.rs
@@ -41,18 +41,12 @@ crate::define_rpc_request! {
         let mut node_impl = node.node_impl();
         let status = node.status();
 
-        let check_term = |requested_term| -> Result<()> {
-            if requested_term != status.term {
-                Err(TraftError::TermMismatch {
-                    requested: requested_term,
-                    current: status.term,
-                })
-            } else {
-                Ok(())
-            }
-        };
-
-        check_term(requested_term)?;
+        if requested_term != status.term {
+            return Err(TraftError::TermMismatch {
+                requested: requested_term,
+                current: status.term,
+            });
+        }
         if status.leader_id != Some(node.raft_id()) {
             // Nearly impossible error indicating invalid request.
             return Err(TraftError::NotALeader);
@@ -75,7 +69,14 @@ crate::define_rpc_request! {
 
         // Also check that requested index actually belongs to the
         // requested term.
-        check_term(raft_log.term(requested).unwrap_or(0))?;
+        let entry_term = raft_log.term(requested).unwrap_or(0);
+        if entry_term != status.term {
+            return Err(Error::EntryTermMismatch {
+                index: requested,
+                expected_term: status.term,
+                actual_term: entry_term,
+            }.into());
+        }
 
         let last_persisted = raft::Storage::last_index(raft_storage)?;
         assert!(last_persisted <= last);
@@ -196,6 +197,14 @@ pub enum Error {
         conflict_index: RaftIndex,
     },
 
+    /// Checking the predicate revealed a collision.
+    #[error("entry at index {index} has term {actual_term}, request implies term {expected_term}")]
+    EntryTermMismatch {
+        index: RaftIndex,
+        expected_term: RaftTerm,
+        actual_term: RaftTerm,
+    },
+
     #[error("space {space} is prohibited for use in a predicate")]
     SpaceNotAllowed { space: String },
 
diff --git a/test/int/test_cas.py b/test/int/test_cas.py
index eb89cae919d99aebc2d73a083554fe3da48474c9..3fa674406a15444ba3e4c5fcf3c52d533acfca8f 100644
--- a/test/int/test_cas.py
+++ b/test/int/test_cas.py
@@ -52,7 +52,7 @@ def test_cas_errors(instance: Instance):
         )
     assert e3.value.args == (
         "ER_PROC_C",
-        "operation request from different term 1, current term is 2",
+        "compare-and-swap request failed: entry at index 1 has term 1, request implies term 2",
     )
 
     # Wrong index (too big)