class ScraperException(Exception): def __init__(self, message, original_exception=None): super().__init__(message) self.original_exception = original_exception class NetworkException(ScraperException): def __init__(self, message, status_code=None, original_exception=None): super().__init__(message, original_exception) self.status_code = status_code class ParseException(ScraperException): def __init__(self, message, selector=None, original_exception=None): super().__init__(message, original_exception) self.selector = selector class ValidationException(ScraperException): def __init__(self, message, field=None, original_exception=None): super().__init__(message, original_exception) self.field = field class StorageException(ScraperException): def __init__(self, message, file_path=None, original_exception=None): super().__init__(message, original_exception) self.file_path = file_path class StrategyException(ScraperException): def __init__(self, message, strategy_name=None, original_exception=None): super().__init__(message, original_exception) self.strategy_name = strategy_name