From 312d380aab0f9192a823a380d1e0a2dcf7461939 Mon Sep 17 00:00:00 2001 From: adv3nt3 Date: Tue, 7 Apr 2026 13:51:27 +0200 Subject: [PATCH] fix: narrow bare except Exception to specific types where safe Replace broad except Exception with specific exception types in 6 sites where the expected failure mode is well-defined: - normalize.py: OSError for file read, ImportError for optional import - miner.py: OSError for file read_text - entity_detector.py: OSError for file read in scan loop - convo_miner.py: (OSError, ValueError) for normalize which reads and parses files - entity_registry.py: (URLError, OSError, JSONDecodeError, KeyError) for Wikipedia lookup fallback ChromaDB except Exception sites (~30) are left broad for now. chromadb.errors defines NotFoundError, DuplicateIDError, InvalidDimensionException etc., but narrowing those sites requires importing from chromadb.errors and validating across supported versions (>=0.4.0). MCP server handlers also left broad for resilience. --- mempalace/convo_miner.py | 2 +- mempalace/entity_detector.py | 2 +- mempalace/entity_registry.py | 2 +- mempalace/miner.py | 2 +- mempalace/normalize.py | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mempalace/convo_miner.py b/mempalace/convo_miner.py index 0034d70..99255d6 100644 --- a/mempalace/convo_miner.py +++ b/mempalace/convo_miner.py @@ -301,7 +301,7 @@ def mine_convos( # Normalize format try: content = normalize(str(filepath)) - except Exception: + except (OSError, ValueError): continue if not content or len(content.strip()) < MIN_CHUNK_SIZE: diff --git a/mempalace/entity_detector.py b/mempalace/entity_detector.py index 63a7883..b86c381 100644 --- a/mempalace/entity_detector.py +++ b/mempalace/entity_detector.py @@ -660,7 +660,7 @@ def detect_entities(file_paths: list, max_files: int = 10) -> dict: all_text.append(content) all_lines.extend(content.splitlines()) files_read += 1 - except Exception: + except OSError: continue combined_text = "\n".join(all_text) diff --git a/mempalace/entity_registry.py b/mempalace/entity_registry.py index a7a0dfe..df251ce 100644 --- a/mempalace/entity_registry.py +++ b/mempalace/entity_registry.py @@ -256,7 +256,7 @@ def _wikipedia_lookup(word: str) -> dict: "note": "not found in Wikipedia — likely a proper noun or unusual name", } return {"inferred_type": "unknown", "confidence": 0.0, "wiki_summary": None} - except Exception: + except (urllib.error.URLError, OSError, json.JSONDecodeError, KeyError): return {"inferred_type": "unknown", "confidence": 0.0, "wiki_summary": None} diff --git a/mempalace/miner.py b/mempalace/miner.py index ecd313d..5771f75 100644 --- a/mempalace/miner.py +++ b/mempalace/miner.py @@ -248,7 +248,7 @@ def process_file( try: content = filepath.read_text(encoding="utf-8", errors="replace") - except Exception: + except OSError: return 0 content = content.strip() diff --git a/mempalace/normalize.py b/mempalace/normalize.py index 62124e9..2acf6e7 100644 --- a/mempalace/normalize.py +++ b/mempalace/normalize.py @@ -27,7 +27,7 @@ def normalize(filepath: str) -> str: try: with open(filepath, "r", encoding="utf-8", errors="replace") as f: content = f.read() - except Exception as e: + except OSError as e: raise IOError(f"Could not read {filepath}: {e}") if not content.strip(): @@ -213,7 +213,7 @@ def _messages_to_transcript(messages: list, spellcheck: bool = True) -> str: from mempalace.spellcheck import spellcheck_user_text _fix = spellcheck_user_text - except Exception: + except ImportError: _fix = None else: _fix = None