为了账号安全,请及时绑定邮箱和手机立即绑定

Paho MQTT Python 客户端:不抛出异常,只是停止

Paho MQTT Python 客户端:不抛出异常,只是停止

jeck猫 2021-06-11 15:04:41
我尝试在 python3 中设置一个 mqtt 客户端。这不是我第一次这样做,但是我遇到了一个相当奇怪的行为。当尝试从回调函数之一(on_connect 或 on_message)调用包含错误的函数时,python 不会抛出异常(至少没有打印),它只是停在那里。我将一个简短的例子捆绑在一起,重现了这种行为。有人有想法吗?import paho.mqtt.client as mqttimport reimport os.pathimport jsonfrom termcolor import coloredclient = mqtt.Client()def func():    test = 1 + "1"    print("Should never reach that")def on_connect(client, userdata, flags, rc):    """Establishes connection to broker    """    print("Connected to broker with result code " + str(rc))    client.subscribe("test")def on_message(client,userdata,msg):    print("Recieved message on " + msg.topic)    params = {}    if msg.topic == "test":        print("Invoke func")        func()if __name__ == "__main__":    client.on_connect = on_connect    client.on_message = on_message    client.connect("localhost",1883,60)    client.loop_forever()这是向主题“test”发送消息时的输出:Connected to broker with result code 0Recieved message on testInvoke func从 main 调用 func() 时,我得到正确的 TypeError 抛出。所以有些东西在 paho 中捕获了这个异常。我查看了一个较旧的项目(尽管是 python2)并尝试重新创建行为。在那里异常被正确抛出。我想念什么?编辑 我可以通过将 func() 调用放在 try 块中来捕获异常。但是,当没有被捕获时,它不会停止程序的执行。我不明白为什么
查看完整描述

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

这是因为该on_message函数是由网络线程调用的,并且它将将该调用包装在一个try块中以阻止错误on_message停止该线程。

如果您想出错以停止应用程序,那么您应该使用自己的tryon_message并进行适当的操作。


查看完整回答
反对 回复 2021-06-22
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

对于遇到这个问题并想知道为什么 mqtt 回调中的所有异常都没有抛出或至少不可见的任何人:与 paho 的 python2 版本相比,客户端已经捕获了调用用户集回调时发生的所有异常职能。然后将此捕获的输出输出到 on_log 回调函数。如果这不是由用户实现的,将没有可见的输出。所以只需添加


def on_log(client, userdata, level, buff):

    print(buff)


mqttc.on_log = on_log

到您的代码,打印出异常。


查看完整回答
反对 回复 2021-06-22
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

您可以使用try+捕获错误expect,然后使用回溯手动打印错误消息和指向错误源的指针。与使用 on_log 函数相比,这将为您提供模式详细信息。


import traceback


def on_message(client, userdata, msg):

    try:

        do_something(msg)

    except:

        traceback.print_exc()

        quit(0)


查看完整回答
反对 回复 2021-06-22

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号