Почему `socket.error` обрабатывается так, как будто он не является производным от `BaseException`?

#python #django #exception #redis

#python #django #исключение #redis

Вопрос:

Итак, у меня есть Django 2.2.16, работающий с redis библиотекой 3.5.0.

Где-то по пути Connection объекты Redis выходят из области видимости и получают их __del__ called, который вызывает disconnect() метод в библиотеке Redis, это выглядит следующим образом:

     def disconnect(self):
        "Disconnects from the Redis server"
        self._parser.on_disconnect()
        if self._sock is None:
            return
        try:
            if os.getpid() == self.pid:
                shutdown(self._sock, socket.SHUT_RDWR)
            self._sock.close()
        except socket.error:
            pass
        self._sock = None
  

Теперь, когда это происходит, это исключение перехватывается:

 October 12th 2020, 14:28:30.750 Exception ignored in: <function Connection.__del__ at 0x7fddec766830>
October 12th 2020, 14:28:30.750 Traceback (most recent call last):
October 12th 2020, 14:28:30.750   File "/usr/local/lib/python3.7/site-packages/redis/connection.py", line 537, in __del__
October 12th 2020, 14:28:30.750   File "/usr/local/lib/python3.7/site-packages/redis/connection.py", line 667, in disconnect
October 12th 2020, 14:28:30.750 TypeError: catching classes that do not inherit from BaseException is not allowed
  

Строка 667 в disconnect здесь относится к этой строке: except socket.error:

Now socket — это стандартная библиотека, и она .error , безусловно, является производной BaseException , почему я вообще получаю это исключение?