Error Handling
Common JSON Loading Exceptions
When working with JSON in Python, several exceptions can occur during file loading and parsing:
| Exception |
Description |
Typical Cause |
| FileNotFoundError |
File does not exist |
Invalid file path |
| json.JSONDecodeError |
Invalid JSON syntax |
Malformed JSON data |
| PermissionError |
Insufficient file access rights |
Restricted file permissions |
Comprehensive Error Handling Strategy
import json
import sys
def safe_json_load(filename):
try:
with open(filename, 'r') as file:
return json.load(file)
except FileNotFoundError:
print(f"Error: File {filename} not found")
sys.exit(1)
except json.JSONDecodeError as e:
print(f"JSON Parsing Error: {e}")
sys.exit(1)
except PermissionError:
print(f"Error: No permission to read {filename}")
sys.exit(1)
Error Handling Workflow
graph TD
A[Attempt JSON Load] --> B{File Exists?}
B -->|Yes| C{Valid JSON?}
B -->|No| D[Handle FileNotFoundError]
C -->|Yes| E[Process JSON]
C -->|No| F[Handle JSONDecodeError]
Advanced Error Handling Techniques
Custom Exception Handling
class JSONLoadError(Exception):
"""Custom exception for JSON loading errors"""
pass
def robust_json_load(filename):
try:
with open(filename, 'r') as file:
data = json.load(file)
## Additional validation
if not isinstance(data, dict):
raise JSONLoadError("Invalid JSON structure")
return data
except (FileNotFoundError, json.JSONDecodeError) as e:
raise JSONLoadError(f"Failed to load JSON: {e}")
Logging Errors
import logging
import json
logging.basicConfig(level=logging.ERROR)
def log_json_errors(filename):
try:
with open(filename, 'r') as file:
return json.load(file)
except FileNotFoundError:
logging.error(f"File {filename} not found")
except json.JSONDecodeError as e:
logging.error(f"JSON parsing error: {e}")
Best Practices
- Always use try-except blocks
- Provide meaningful error messages
- Log errors for debugging
- Implement fallback mechanisms
- Validate JSON structure before processing
Validation Techniques
def validate_json_structure(data):
required_keys = ['name', 'age', 'email']
return all(key in data for key in required_keys)
def load_and_validate(filename):
try:
with open(filename, 'r') as file:
data = json.load(file)
if validate_json_structure(data):
return data
else:
raise ValueError("Invalid JSON structure")
except Exception as e:
print(f"Validation failed: {e}")
LabEx recommends implementing robust error handling to create more reliable and maintainable Python applications when working with JSON files.