diff --git a/core/registrar/registrar.py b/core/registrar/registrar.py index 968ff05422939d68ec30bd83c3ad62f963a37091..bcd4800d46d6a2c1d6f3b86ebe95385f67fe8b8f 100644 --- a/core/registrar/registrar.py +++ b/core/registrar/registrar.py @@ -1,11 +1,11 @@ import re import logging -import importlib from .source import get_source from .scheme import get_scheme from .backend import get_backends from .exceptions import RegistrationError +from .utils import import_by_path logger = logging.getLogger(__name__) @@ -22,22 +22,27 @@ def register_file(config: dict, path: str, replace: bool=False): for pre_handler in get_pre_handlers(config): pre_handler(config, path, context) - for backend in get_backends(config, path): - if backend.exists(source, context): - if replace: - logger.info(f"Replacing '{path}'.") - backend.register(source, context, replace=True) + try: + for backend in get_backends(config, path): + if backend.exists(source, context): + if replace: + logger.info(f"Replacing '{path}'.") + backend.register(source, context, replace=True) + else: + raise RegistrationError(f'Object {context} is already registered') else: - raise RegistrationError(f'Object {context} is already registered') - else: - logger.info(f"Registering '{path}'.") - backend.register(source, context, replace=False) + logger.info(f"Registering '{path}'.") + backend.register(source, context, replace=False) + except Exception as e: + for error_handler in get_error_handlers(config): + error_handler(config, path, context, e) + raise + else: + for post_handler in get_post_handlers(config): + post_handler(config, path, context) - for post_handler in get_post_handlers(config): - post_handler(config, path, context) - - logger.info(f"Successfully {'replaced' if replace else 'registered'} '{path}'") - return context + logger.info(f"Successfully {'replaced' if replace else 'registered'} '{path}'") + return context def _get_handlers(config, name): @@ -61,3 +66,7 @@ def get_pre_handlers(config): def get_post_handlers(config): return _get_handlers(config, 'post_handlers') + + +def get_error_handlers(config): + return _get_handlers(config, 'error_handlers')