Могу ли я обернуть объект python для перехвата исключений?

Я хотел бы обернуть объект достаточно универсально, чтобы поймать исключение во всех методах.

Предположим, у меня есть этот класс:

class CanThrowException:
    def not1(self, param):
        if param == 1:
            raise ValueError('Parameter value cannot be 1')

        return "Your parameter is {}".format(param)

    def not2(self, param):
        if param == 2:
            raise ValueError('Parameter value cannot be 2')

        return "Your parameter is {}".format(param)

Я хотел бы обернуть объект, чтобы перехватить исключения, но без создания класса, который определяет все методы, присутствующие в классе CanThrowException. Есть ли способ сделать это в Python?

Я использую Python Bravado для анализа определения REST API и выполнения тестов на API. При обычном использовании API, если конечная точка возвращает что-то отличное от http-кода 2xx, вызов не удался. Вот почему бравада будет выдвигать исключения в этих случаях. Но в моем случае я вызываю эти ошибки при тестировании API, поэтому в этом контексте они не являются ошибками.

Вот почему я хотел бы изолировать использование бравады, управление исключением ( как рекомендовано командой бравады) и возвращение того, что нужно знать моим тестам.

Заранее спасибо!

1 ответ

Вы рассматривали что-то подобное?

class Wrapper:
    def __init__(self, obj):
        self.obj = obj

    def __getattr__(self, item):
        prop = getattr(self.obj, item)
        if callable(prop):
            def unraisable(*args, **kwargs):
                try:
                    return prop(*args, **kwargs)
                except Exception:
                    return None

            return unraisable

        return prop

instance = Wrapper(CanThrowException())
instance.not1(1)  # returns None
instance.not1(2)  # returns 'Your parameter is 2'
Другие вопросы по тегам