diff --git a/swh/model/identifiers.py b/swh/model/identifiers.py
index c9f20dcb7b52b83dbd13f42a633822f87c961222..537f1e3f7096f1a8e45488e8b39f0d4a72c274be 100644
--- a/swh/model/identifiers.py
+++ b/swh/model/identifiers.py
@@ -925,7 +925,7 @@ class _BaseSWHID(Generic[_TObjectType]):
             return cls(**parts)
         except ValueError as e:
             raise ValidationError(
-                "ValueError: %(args)", params={"args": e.args}
+                "ValueError: %(args)s", params={"args": e.args}
             ) from None
 
 
@@ -996,7 +996,7 @@ def _parse_lines_qualifier(
             return (int(lines), None)
     except ValueError:
         raise ValidationError(
-            "Invalid format for the lines qualifier: %(lines)", params={"lines": lines}
+            "Invalid format for the lines qualifier: %(lines)s", params={"lines": lines}
         )
 
 
@@ -1152,7 +1152,7 @@ class QualifiedSWHID(_BaseSWHID[ObjectType]):
         invalid_qualifiers = set(qualifiers) - SWHID_QUALIFIERS
         if invalid_qualifiers:
             raise ValidationError(
-                "Invalid qualifier(s): %(qualifiers)",
+                "Invalid qualifier(s): %(qualifiers)s",
                 params={"qualifiers": ", ".join(invalid_qualifiers)},
             )
         try:
diff --git a/swh/model/tests/test_identifiers.py b/swh/model/tests/test_identifiers.py
index 3ba570867e6cd529166547978bd948068c3b4a5e..99a23f5a5cc2c98380bb76831a27d47c110b19b8 100644
--- a/swh/model/tests/test_identifiers.py
+++ b/swh/model/tests/test_identifiers.py
@@ -1241,6 +1241,12 @@ VALID_SWHIDS = [
         ),
         None,  # Neither does ExtendedSWHID
     ),
+    (
+        f"swh:1:cnt:{HASH};origin=https://github.com/python/cpython;lines=1-18/",
+        None,  # likewise
+        None,
+        None,  # likewise
+    ),
     (
         f"swh:1:cnt:{HASH};origin=https://github.com/python/cpython;lines=18",
         None,  # likewise
@@ -1298,8 +1304,10 @@ def test_parse_unparse_swhids(string, core, qualified, extended):
     for (cls, parsed_swhid) in zip(classes, [core, qualified, extended]):
         if parsed_swhid is None:
             # This class should not accept this SWHID
-            with pytest.raises(ValidationError):
+            with pytest.raises(ValidationError) as excinfo:
                 cls.from_string(string)
+            # Check string serialization for exception
+            assert str(excinfo.value) is not None
         else:
             # This class should
             assert cls.from_string(string) == parsed_swhid