Почему слишком сложная попытка: / исключение: недостаточно, чтобы поймать исключение? - PullRequest
0 голосов
/ 10 февраля 2019

Я думаю, что самый внешний try: / except: всегда будет ловить исключение (тот факт, что это, вероятно, не очень хорошая идея, вне вопроса):

try:
    try:
        raise ValueError
    except:
        raise ValueError
except:
    pass

In некоторый код Я иду, однако, я столкнулся со случаем, когда

def process_batch(self):
    try:
        p = util.json_dumps(self.batch_data)
        mac = hmac.new(self.key, p)
        send_bytes = struct.pack('B', mac.digest_size) + mac.digest() + p
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            try:
                s.connect((self.host, self.port))
            except socket.error:
                s.close()
                s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
                s.connect((self.host, self.port))
            s.send(send_bytes)
        finally:
            s.close()
    except Exception:
        self.logger_logger.exception("Failed to send network data")

вызвал исключение:

2019-02-09 23:32:51     INFO (simplemonitor) monitor passed: hass
2019-02-09 23:32:51     INFO (simplemonitor) monitor passed: dns
2019-02-09 23:32:51    ERROR (simplemonitor.logger-send-to-srv) Failed to send network data
Traceback (most recent call last):
  File "/opt/simplemonitor/Loggers/network.py", line 89, in process_batch
    s.connect((self.host, self.port))
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/simplemonitor/Loggers/network.py", line 93, in process_batch
    s.connect((self.host, self.port))
socket.gaierror: [Errno -5] No address associated with hostname

Почему это так?Почему сверхспособление try: / except: не уловило исключение?

1 Ответ

0 голосов
/ 10 февраля 2019

В приведенном втором примере кода сообщение Traceback на самом деле не было необработанным исключением из-за того, что обработчик исключений вызвал метод logger.exception, который распечатает указанное сообщение вместе с завершеннымTraceback сообщение в поток регистрации.Если Traceback не требуется, использование logger.error создаст сообщение журнала на том же уровне ERROR без него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...