在不存在的字典中访问元素时,为什么不引发回溯?

月刊

我在代码中有一个地方,我在的键名上犯了一个错误dict花了一些时间来理解为什么代码没有运行,因为没有引发回溯

下面的代码是完整的,→→→并以问题所在的位置突出显示

class Alert:

    lock = threading.Lock()
    sent_alerts = {}

    @staticmethod
    def start_alert_listener():
        # load existing alerts to keep persistancy
        try:
            with open("sent_alerts.json") as f:
                json.load(f)
        except FileNotFoundError:
            # there is no file, never mind - it will be created at some point
            pass
        # start the listener
        log.info("starting alert listener")
        client = paho.mqtt.client.Client()
        client.on_connect = Alert.mqtt_connection_alert
        client.on_message = Alert.alert
        client.connect("mqtt.XXXX", 1883, 60)
        client.loop_forever()

    @staticmethod
    def mqtt_connection_alert(client, userdata, flags, rc):
        if rc:
            log.critical(f"error connecting to MQTT: {rc}")
            sys.exit()
        topic = "monitor/+/state"
        client.subscribe(topic)
        log.info(f"subscribed alert to {topic}")

    @staticmethod
    def alert(client, userdata, msg):
        event = json.loads(msg.payload)
        log.debug(f"received alert: {event}")
→→→     if event['ok']:
            # remove existing sent flag, not thread safe!
            with Alert.lock:
                Alert.sent_alerts.pop(msg['id'], None)
            return
        (...)
        

来自上面一行的日志是

2021-01-14 22:03:02,617 [monitor] DEBUG received alert: {'full_target_name': 'ThisAlwaysFails → a failure', 'isOK': False, 'why': 'explicit fail', 'extra': None, 'id': '6507a61c9688199a34cb006b354c8433', 'last': '2021-01-14T22:03:02.612912+01:00', 'last_ko': '2021-01-14T22:03:02.612912+01:00'}

这是dict我要尝试错误访问的位置ok,这应该引发异常和回溯。但是什么也没发生。该代码的作用就好像错误被静默丢弃(该方法静默失败)一样。

我试图raise Exception("wazaa")log.debug()之间放置一个if-同样的方法,该方法此时会失败,但不会引发异常。

我不知道为什么通过追溯无法看到异常的原因?


alert()如果这很重要,则在单独的线程中调用方法。为了完整起见,我尝试使用follwong代码只是为了确保threading不干扰但不干扰(我不知道这样做的原因)

import threading

class Hello:

    @staticmethod
    def a():
        raise Exception("I am an exception")

threading.Thread(target=Hello.a).start()

输出

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python38\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Python38\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:/Users/yop/AppData/Roaming/JetBrains/PyCharm2020.3/scratches/scratch_1.py", line 7, in a
    raise Exception("I am an exception")
Exception: I am an exception
致癌物质

它似乎在中调用了您的回调try,然后记录了该错误:

try:
    self.on_message(self, self._userdata, message)
except Exception as err:
    self._easy_log(
        MQTT_LOG_ERR, 'Caught exception in on_message: %s', err)
    if not self.suppress_exceptions:
        raise

但是,我无法解释的是为什么没有例外raise我看不到为什么self.suppress_exceptions对您适用,因为您从未设置过,但是请尝试:

  • suppress_exceptions使用手动设置client.suppress_exceptions = False这不是必需的,因为这似乎是默认值,但是值得一试。

  • 检查它显然维护的日志。不过,您需要参考文档以了解具体操作方法,因为我以前从未接触过该库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当哈希值不存在时,为什么不引发异常?

来自分类Dev

当哈希值不存在时,为什么不引发异常?

来自分类Dev

访问属性但对象中不存在属性时引发错误

来自分类Dev

为什么在迭代过程中从映射中删除不存在的元素有时只会崩溃?

来自分类Dev

为什么在此示例中尝试不触发回溯

来自分类Dev

为什么此代码不会显示错误:当不存在的文件引发e时找不到文件?

来自分类Dev

为什么运行“ ifconfig”时不存在“ 10.0.2.2”?

来自分类Dev

在PHP中,当类不存在时,为什么\ Foo \ Bar :: class不会生成错误?

来自分类Dev

创建表时,为什么MySQL数据库中不存在主键字段?

来自分类Dev

在Python中检索列表或字典中不存在的元素时如何获得类似错误的值而不是错误

来自分类Dev

当我尝试从HashSet中删除不存在的元素时,为什么它没有给出运行时错误?

来自分类Dev

当我尝试从不存在的HashSet中删除元素时,为什么它没有给出运行时错误?

来自分类Dev

访问不存在的数组元素

来自分类Dev

为什么C ++中不存在引用成员的功能?

来自分类Dev

为什么C#中不存在吊装?

来自分类Dev

为什么[分支“开发”]在.git / config中不存在?

来自分类Dev

为什么JavaScript中不存在clientRight或clientBottom?

来自分类Dev

为什么C ++中不存在引用成员的功能?

来自分类Dev

为什么systemd等待`fstab`中不存在的磁盘?

来自分类Dev

为什么在输出路径中不存在dll

来自分类Dev

为什么脚本中不存在Camera?

来自分类Dev

为什么POST请求中不存在该属性?

来自分类Dev

访问JavaScript对象的不存在属性时如何引发错误

来自分类Dev

使用回调函数时,JavaScript如何从不存在于DOM中的iframe中访问元素?

来自分类Dev

如果实体不存在,如何告诉Springdata存储库的delete方法不引发异常?

来自分类Dev

给定的键在字典中不存在

来自分类Dev

为什么此代码在编译正常时会引发“名称空间中不存在”错误?

来自分类Dev

为什么打字稿会引发错误消息:类型上不存在属性?

来自分类Dev

如果表不存在,为什么DROP TABLE IF EXISTS会引发MySQL警告?

Related 相关文章

  1. 1

    当哈希值不存在时,为什么不引发异常?

  2. 2

    当哈希值不存在时,为什么不引发异常?

  3. 3

    访问属性但对象中不存在属性时引发错误

  4. 4

    为什么在迭代过程中从映射中删除不存在的元素有时只会崩溃?

  5. 5

    为什么在此示例中尝试不触发回溯

  6. 6

    为什么此代码不会显示错误:当不存在的文件引发e时找不到文件?

  7. 7

    为什么运行“ ifconfig”时不存在“ 10.0.2.2”?

  8. 8

    在PHP中,当类不存在时,为什么\ Foo \ Bar :: class不会生成错误?

  9. 9

    创建表时,为什么MySQL数据库中不存在主键字段?

  10. 10

    在Python中检索列表或字典中不存在的元素时如何获得类似错误的值而不是错误

  11. 11

    当我尝试从HashSet中删除不存在的元素时,为什么它没有给出运行时错误?

  12. 12

    当我尝试从不存在的HashSet中删除元素时,为什么它没有给出运行时错误?

  13. 13

    访问不存在的数组元素

  14. 14

    为什么C ++中不存在引用成员的功能?

  15. 15

    为什么C#中不存在吊装?

  16. 16

    为什么[分支“开发”]在.git / config中不存在?

  17. 17

    为什么JavaScript中不存在clientRight或clientBottom?

  18. 18

    为什么C ++中不存在引用成员的功能?

  19. 19

    为什么systemd等待`fstab`中不存在的磁盘?

  20. 20

    为什么在输出路径中不存在dll

  21. 21

    为什么脚本中不存在Camera?

  22. 22

    为什么POST请求中不存在该属性?

  23. 23

    访问JavaScript对象的不存在属性时如何引发错误

  24. 24

    使用回调函数时,JavaScript如何从不存在于DOM中的iframe中访问元素?

  25. 25

    如果实体不存在,如何告诉Springdata存储库的delete方法不引发异常?

  26. 26

    给定的键在字典中不存在

  27. 27

    为什么此代码在编译正常时会引发“名称空间中不存在”错误?

  28. 28

    为什么打字稿会引发错误消息:类型上不存在属性?

  29. 29

    如果表不存在,为什么DROP TABLE IF EXISTS会引发MySQL警告?

热门标签

归档