Skip to content

Commit 16a1644

Browse files
authored
Implemented exception chaining for all re-raised exceptions (neo4j#66)
* Implemented exception chaining for all re-raised exceptions * Made index.py error messages more consistent * Updated CHANGELOG
1 parent 24964a2 commit 16a1644

File tree

9 files changed

+38
-26
lines changed

9 files changed

+38
-26
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
### Changed
1515
- Refactored import paths for retrievers to neo4j_genai.retrievers.
16+
- Implemented exception chaining for all re-raised exceptions to improve stack trace readability.
17+
- Made error messages in `index.py` more consistent.
1618

1719
## 0.2.0
1820

src/neo4j_genai/embeddings/sentence_transformers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ def __init__(
1010
) -> None:
1111
try:
1212
from sentence_transformers import SentenceTransformer
13-
except ImportError:
13+
except ImportError as e:
1414
raise ImportError(
1515
"Could not import sentence_transformers python package. "
1616
"Please install it with `pip install sentence-transformers`."
17-
)
17+
) from e
1818

1919
self.model = SentenceTransformer(model, *args, **kwargs)
2020

src/neo4j_genai/indexes.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ def create_vector_index(
6565
similarity_fn=similarity_fn,
6666
)
6767
except ValidationError as e:
68-
raise Neo4jIndexError(f"Error for inputs to create_vector_index {str(e)}")
68+
raise Neo4jIndexError(
69+
f"Error for inputs to create_vector_index {e.errors()}"
70+
) from e
6971

7072
try:
7173
query = (
@@ -78,7 +80,7 @@ def create_vector_index(
7880
{"name": name, "dimensions": dimensions, "similarity_fn": similarity_fn},
7981
)
8082
except neo4j.exceptions.ClientError as e:
81-
raise Neo4jIndexError(f"Neo4j vector index creation failed: {e}")
83+
raise Neo4jIndexError(f"Neo4j vector index creation failed: {e.message}") from e
8284

8385

8486
def create_fulltext_index(
@@ -108,7 +110,9 @@ def create_fulltext_index(
108110
driver=driver, name=name, label=label, node_properties=node_properties
109111
)
110112
except ValidationError as e:
111-
raise Neo4jIndexError(f"Error for inputs to create_fulltext_index: {str(e)}")
113+
raise Neo4jIndexError(
114+
f"Error for inputs to create_fulltext_index: {e.errors()}"
115+
) from e
112116

113117
try:
114118
query = (
@@ -119,7 +123,9 @@ def create_fulltext_index(
119123
logger.info(f"Creating fulltext index named '{name}'")
120124
driver.execute_query(query, {"name": name})
121125
except neo4j.exceptions.ClientError as e:
122-
raise Neo4jIndexError(f"Neo4j fulltext index creation failed {e}")
126+
raise Neo4jIndexError(
127+
f"Neo4j fulltext index creation failed {e.message}"
128+
) from e
123129

124130

125131
def drop_index_if_exists(driver: neo4j.Driver, name: str) -> None:
@@ -143,7 +149,7 @@ def drop_index_if_exists(driver: neo4j.Driver, name: str) -> None:
143149
logger.info(f"Dropping index named '{name}'")
144150
driver.execute_query(query, parameters)
145151
except neo4j.exceptions.ClientError as e:
146-
raise Neo4jIndexError(f"Dropping Neo4j index failed: {e}")
152+
raise Neo4jIndexError(f"Dropping Neo4j index failed: {e.message}") from e
147153

148154

149155
def upsert_vector(
@@ -179,4 +185,6 @@ def upsert_vector(
179185
}
180186
driver.execute_query(query, parameters)
181187
except neo4j.exceptions.ClientError as e:
182-
raise Neo4jInsertionError(f"Upserting vector to Neo4j failed: {e}")
188+
raise Neo4jInsertionError(
189+
f"Upserting vector to Neo4j failed: {e.message}"
190+
) from e

src/neo4j_genai/retrievers/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ def _fetch_index_infos(self) -> None:
7373
self._node_label = result["labels"][0]
7474
self._embedding_node_property = result["properties"][0]
7575
self._embedding_dimension = result["dimensions"]
76-
except IndexError:
77-
raise Exception(f"No index with name {self.index_name} found")
76+
except IndexError as e:
77+
raise Exception(f"No index with name {self.index_name} found") from e
7878

7979
def search(self, *args: Any, **kwargs: Any) -> RetrieverResult:
8080
"""

src/neo4j_genai/retrievers/external/pinecone/pinecone.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def __init__(
109109
result_formatter=result_formatter,
110110
)
111111
except ValidationError as e:
112-
raise RetrieverInitializationError(e.errors())
112+
raise RetrieverInitializationError(e.errors()) from e
113113

114114
super().__init__(
115115
driver=driver,
@@ -190,7 +190,7 @@ def _get_search_results(
190190
pinecone_filter=pinecone_filters,
191191
)
192192
except ValidationError as e:
193-
raise SearchValidationError(e.errors())
193+
raise SearchValidationError(e.errors()) from e
194194

195195
if validated_data.query_text:
196196
if self.embedder:

src/neo4j_genai/retrievers/external/weaviate/weaviate.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def __init__(
102102
result_formatter=result_formatter,
103103
)
104104
except ValidationError as e:
105-
raise RetrieverInitializationError(e.errors())
105+
raise RetrieverInitializationError(e.errors()) from e
106106

107107
super().__init__(driver, id_property_external, id_property_neo4j)
108108
self.client = validated_data.client_model.client
@@ -176,7 +176,7 @@ def _get_search_results(
176176
top_k = validated_data.top_k
177177
weaviate_filters = validated_data.weaviate_filters
178178
except ValidationError as e:
179-
raise SearchValidationError(e.errors())
179+
raise SearchValidationError(e.errors()) from e
180180

181181
# If we want to use a local embedder, we still want to call the near_vector method
182182
# so we want to create the vector as early as possible here

src/neo4j_genai/retrievers/hybrid.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def __init__(
8888
return_properties=return_properties,
8989
)
9090
except ValidationError as e:
91-
raise RetrieverInitializationError(e.errors())
91+
raise RetrieverInitializationError(e.errors()) from e
9292

9393
super().__init__(validated_data.driver_model.driver)
9494
self.vector_index_name = validated_data.vector_index_name
@@ -152,7 +152,7 @@ def _get_search_results(
152152
query_text=query_text,
153153
)
154154
except ValidationError as e:
155-
raise SearchValidationError(e.errors())
155+
raise SearchValidationError(e.errors()) from e
156156

157157
parameters = validated_data.model_dump(exclude_none=True)
158158

@@ -229,7 +229,7 @@ def __init__(
229229
embedder_model=embedder_model,
230230
)
231231
except ValidationError as e:
232-
raise RetrieverInitializationError(e.errors())
232+
raise RetrieverInitializationError(e.errors()) from e
233233

234234
super().__init__(validated_data.driver_model.driver)
235235
self.vector_index_name = validated_data.vector_index_name
@@ -283,7 +283,7 @@ def _get_search_results(
283283
query_params=query_params,
284284
)
285285
except ValidationError as e:
286-
raise SearchValidationError(e.errors())
286+
raise SearchValidationError(e.errors()) from e
287287

288288
parameters = validated_data.model_dump(exclude_none=True)
289289

src/neo4j_genai/retrievers/text2cypher.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def __init__(
7777
examples=examples,
7878
)
7979
except ValidationError as e:
80-
raise RetrieverInitializationError(e.errors())
80+
raise RetrieverInitializationError(e.errors()) from e
8181

8282
super().__init__(validated_data.driver_model.driver)
8383
self.llm = validated_data.llm_model.llm
@@ -92,7 +92,7 @@ def __init__(
9292
error_message = getattr(e, "message", str(e))
9393
raise SchemaFetchError(
9494
f"Failed to fetch schema for Text2CypherRetriever: {error_message}"
95-
)
95+
) from e
9696

9797
def _get_search_results(
9898
self,
@@ -114,7 +114,7 @@ def _get_search_results(
114114
try:
115115
validated_data = Text2CypherSearchModel(query_text=query_text)
116116
except ValidationError as e:
117-
raise SearchValidationError(e.errors())
117+
raise SearchValidationError(e.errors()) from e
118118

119119
prompt_template = Text2CypherTemplate()
120120
prompt = prompt_template.format(
@@ -130,7 +130,9 @@ def _get_search_results(
130130
logger.debug("Text2CypherRetriever Cypher query: %s", t2c_query)
131131
records, _, _ = self.driver.execute_query(query_=t2c_query)
132132
except CypherSyntaxError as e:
133-
raise Text2CypherRetrievalError(f"Failed to get search result: {e.message}")
133+
raise Text2CypherRetrievalError(
134+
f"Failed to get search result: {e.message}"
135+
) from e
134136

135137
return RawSearchResult(
136138
records=records,

src/neo4j_genai/retrievers/vector.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def __init__(
8686
return_properties=return_properties,
8787
)
8888
except ValidationError as e:
89-
raise RetrieverInitializationError(e.errors())
89+
raise RetrieverInitializationError(e.errors()) from e
9090

9191
super().__init__(driver)
9292
self.index_name = validated_data.index_name
@@ -151,7 +151,7 @@ def _get_search_results(
151151
query_text=query_text,
152152
)
153153
except ValidationError as e:
154-
raise SearchValidationError(e.errors())
154+
raise SearchValidationError(e.errors()) from e
155155

156156
parameters = validated_data.model_dump(exclude_none=True)
157157

@@ -228,7 +228,7 @@ def __init__(
228228
embedder_model=embedder_model,
229229
)
230230
except ValidationError as e:
231-
raise RetrieverInitializationError(e.errors())
231+
raise RetrieverInitializationError(e.errors()) from e
232232

233233
super().__init__(driver)
234234
self.index_name = validated_data.index_name
@@ -281,7 +281,7 @@ def _get_search_results(
281281
query_params=query_params,
282282
)
283283
except ValidationError as e:
284-
raise SearchValidationError(e.errors())
284+
raise SearchValidationError(e.errors()) from e
285285

286286
parameters = validated_data.model_dump(exclude_none=True)
287287

0 commit comments

Comments
 (0)