Не удается поймать смоделированное исключение, потому что оно не наследует BaseException

Я работаю над проектом, который включает подключение к удаленному серверу, ожидание ответа, а затем выполнение действий на основе этого ответа. Мы перехватываем несколько разных исключений и ведем себя по-разному в зависимости от того, какое исключение перехвачено. Например:

def myMethod(address, timeout=20):
    try:
        response = requests.head(address, timeout=timeout)
    except requests.exceptions.Timeout:
        # do something special
    except requests.exceptions.ConnectionError:
        # do something special
    except requests.exceptions.HTTPError:
        # do something special
    else:
        if response.status_code != requests.codes.ok:
            # do something special
        return successfulConnection.SUCCESS

Чтобы проверить это, мы написали тест, подобный следующему

class TestMyMethod(unittest.TestCase):

    def test_good_connection(self):
        config = {
            'head.return_value': type('MockResponse', (), {'status_code': requests.codes.ok}),
            'codes.ok': requests.codes.ok
        }
        with mock.patch('path.to.my.package.requests', **config):
            self.assertEqual(
                mypackage.myMethod('some_address',
                mypackage.successfulConnection.SUCCESS
            )

    def test_bad_connection(self):
        config = {
            'head.side_effect': requests.exceptions.ConnectionError,
            'requests.exceptions.ConnectionError': requests.exceptions.ConnectionError
        }
        with mock.patch('path.to.my.package.requests', **config):
            self.assertEqual(
                mypackage.myMethod('some_address',
                mypackage.successfulConnection.FAILURE
            )

Если я запускаю функцию напрямую, все происходит как положено. Я даже проверил, добавивraise requests.exceptions.ConnectionError кtry пункт функции. Но когда я запускаю свои юнит-тесты, я получаю

ERROR: test_bad_connection (test.test_file.TestMyMethod)
----------------------------------------------------------------
Traceback (most recent call last):
  File "path/to/sourcefile", line ###, in myMethod
    respone = requests.head(address, timeout=timeout)
  File "path/to/unittest/mock", line 846, in __call__
    return _mock_self.mock_call(*args, **kwargs)
  File "path/to/unittest/mock", line 901, in _mock_call
    raise effect
my.package.requests.exceptions.ConnectionError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "Path/to/my/test", line ##, in test_bad_connection
    mypackage.myMethod('some_address',
  File "Path/to/package", line ##, in myMethod
    except requests.exceptions.ConnectionError:
TypeError: catching classes that do not inherit from BaseException is not allowed

Я пытался изменить исключение, которое я исправлял вBaseException и я получил более или менее идентичную ошибку.

я прочелhttps://stackoverflow.com/a/18163759/3076272 уже, так что я думаю, что это должно быть плохо__del__ где-нибудь зацепить, но я не уверен, где его искать или что я могу даже сделать за это время. Я также относительно новичок вunittest.mock.patch() так что вполне возможно, что я тоже что-то не так делаю.

Это надстройка Fusion360, поэтому она использует упакованную версию Fusion 360 Python 3.3 - насколько я знаю, это ванильная версия (то есть они не выпускают свою собственную), но я не уверен в этом.

Ответы на вопрос(5)

Ваш ответ на вопрос