Задать вопрос

Возможно ли улучшить чистоту кода в примере, и стоит ли это того?

У меня есть класс декоратор который используется для обработки исключений в сервисах.
def __call__(self, controller_func):
        @functools.wraps(controller_func)
        def wrapper(instance, *args, **kwargs):
            try:
                return controller_func(instance, *args, **kwargs)
            except (
                errors.FileExtensionError,
                errors.LargeFileSizeError
            ) as error:
                return upload_fail(
                    message=self.__errors_handle_rules[type(error)]['desc']
                )
            except errors.DataAboutRecordNotExistsError:
                abort(404)
            except errors.ServiceError as error:
                self.__handle_error_with_form_data(
                    instance=instance,
                    field_name=self.__errors_handle_rules[type(error)].get(
                        'form_field_name'
                    ),
                    error_msg=self.__errors_handle_rules[type(error)]['desc']
                )
            finally:
                return controller_func(instance, *args, **kwargs)
        return wrapper

функция обёртки получилась слишком длинная. Стоит ли переделать этот декоратор на несколько, для каждой групы исключений? Это может стать результатом таких вещей:
@first_dec
@second_dec
@third_dec
@fourth_dec
def func():
     pass

С другой стороны код на уровне обработчика сервисных ошибок станет более читаемым, а к конкретному контроллеру будут ловится только те исключения, которые могут возникнут на уровне сервесов которые он использует.
  • Вопрос задан
  • 95 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
longclaps
@longclaps
Как я понимаю, все эти ошибки - кастомные, а обрабатывать их предполагается централизованно.
Если верно - можно сделать так:
class CustomError(Exception):
    description = 'CustomError description'

    def rule(self, instance, *args, **kwargs):
        pass


class FileExtensionError(CustomError):
    description = 'FileExtensionError description'

    def rule(self, instance, *args, **kwargs):
        return upload_fail(message=self.description) #  сюда лучше воткнуть тело upload_fail


def decorator(controller_func):
    def wrapper(instance, *args, **kwargs):
        try:
            return controller_func(instance, *args, **kwargs)
        except CustomError as e:
            return e.rule(instance, *args, **kwargs)

    return wrapper
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы