fix: Enhance error handling and logging across multiple evaluators

- Added logging for file retrieval and error handling in file.py, improving robustness during file operations.
- Implemented checks for file existence and parsing errors in general.py, enhancing reliability in JSON/YAML processing.
- Improved table comparison logic in table.py with detailed error logging for sheet loading and cell value reading.
- Enhanced metrics evaluation in slides.py with additional checks for paragraph and run counts, ensuring thorough comparison.
- Updated utils.py to include file existence checks and detailed error logging during cell value reading.
This commit is contained in:
yuanmengqi
2025-07-14 05:43:17 +00:00
parent 349f2fd9fe
commit 0651495d88
5 changed files with 226 additions and 48 deletions

View File

@@ -298,34 +298,84 @@ def check_json(result: str, rules: Dict[str, List[Dict[str, Union[List[str], str
"""
if result is None:
logger.warning("Result file path is None, returning 0.0")
return 0.
# Check if file exists
if not os.path.exists(result):
logger.warning(f"Result file does not exist: {result}, returning 0.0")
return 0.
try:
with open(result, 'r', encoding='utf-8') as f:
if is_yaml:
try:
# Use SafeLoader instead of Loader for better security and error handling
result_data: Dict[str, Any] = yaml.safe_load(f)
if result_data is None:
logger.warning(f"YAML file {result} is empty or contains only null values, returning 0.0")
return 0.
except yaml.YAMLError as e:
logger.error(f"YAML parsing error in file {result}: {e}")
logger.error(f"File content might be corrupted or have invalid YAML syntax")
return 0.
except Exception as e:
logger.error(f"Unexpected error parsing YAML file {result}: {e}")
return 0.
else:
try:
result_data: Dict[str, Any] = json.load(f)
except json.JSONDecodeError as e:
logger.error(f"JSON parsing error in file {result}: {e}")
return 0.
except Exception as e:
logger.error(f"Unexpected error parsing JSON file {result}: {e}")
return 0.
except IOError as e:
logger.error(f"IO error reading file {result}: {e}")
return 0.
except Exception as e:
logger.error(f"Unexpected error reading file {result}: {e}")
return 0.
with open(result) as f:
if is_yaml:
result: Dict[str, Any] = yaml.load(f, Loader=yaml.Loader)
else:
result: Dict[str, Any] = json.load(f)
expect_rules = rules.get("expect", {})
unexpect_rules = rules.get("unexpect", {})
metric = True
for r in expect_rules:
value = result
for k in r["key"]:
try:
value = value[k]
except KeyError:
return 0.
metric = metric and _match_value_to_rule(value, r)
value = result_data
try:
for k in r["key"]:
try:
value = value[k]
except KeyError:
logger.debug(f"Key '{k}' not found in result data, returning 0.0")
return 0.
except TypeError:
logger.debug(f"Cannot access key '{k}' - value is not a dictionary, returning 0.0")
return 0.
metric = metric and _match_value_to_rule(value, r)
except Exception as e:
logger.error(f"Error processing expect rule {r}: {e}")
return 0.
for r in unexpect_rules:
value = result
for k in r["key"]:
try:
value = value[k]
except KeyError:
value = None
break
metric = metric and not _match_value_to_rule(value, r)
value = result_data
try:
for k in r["key"]:
try:
value = value[k]
except KeyError:
value = None
break
except TypeError:
value = None
break
metric = metric and not _match_value_to_rule(value, r)
except Exception as e:
logger.error(f"Error processing unexpect rule {r}: {e}")
return 0.
return float(metric)