代码之家  ›  专栏  ›  技术社区  ›  WoJ

为什么要尝试过多的比较:/except:不足以捕获异常?

  •  1
  • WoJ  · 技术社区  · 5 年前

    我认为那是最外层的 try: / except: 总是会遇到一个例外(这可能不是一个好主意的事实是不可能的):

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

    some code 我要去,我面对的是

    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
    

    为什么会这样?为什么没有过多的鼓励 尝试: / 除: 捕获到异常?

    1 回复  |  直到 5 年前
        1
  •  2
  •   metatoaster    5 年前

    在提供的第二个代码示例中, Traceback 由于异常处理程序调用,消息实际上不是未处理的异常 logger.exception 方法,该方法将打印出指定的消息以及完整的 追溯 消息进入日志流。如果 追溯 不需要,使用 logger.error 将同时生成日志消息 ERROR 没有它的水平。