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

问题描述 投票:3回答:3

我尝试在python3中设置一个mqtt客户端。这不是我第一次这样做,但是我遇到了一个相当奇怪的行为。当尝试从其中一个回调函数(on_connect或on_message)调用包含错误的函数时,python不会抛出异常(至少它不会被打印),它只是停在那里。我把一个简短的例子绑在一起,重现了这种行为。

有人有想法吗?

import paho.mqtt.client as mqtt

import re
import os.path

import json
from termcolor import colored

client = 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 0
Recieved message on test
Invoke func

从main调用func()时,我得到正确的TypeError抛出。所以有些东西在paho中捕获了这个例外。我看了一下oldproject(虽然是python2)并尝试重新创建行为。有异常被正确抛出。我错过了什么?

编辑我可以通过将func()调用放在try块中来捕获异常。但是,如果没有捕获它,它不会停止执行程序。我不明白为什么

python exception mqtt paho
3个回答
2
投票

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

如果你想要一个错误来停止应用程序,那么你应该在try中使用你自己的on_message块并且行为恰当。


4
投票

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

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

到您的代码,您可以在其中打印出例外描述


0
投票

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

import traceback

def on_message(client, userdata, msg):
    try:
        do_something(msg)
    except:
        traceback.print_exc()
        quit(0)
© www.soinside.com 2019 - 2024. All rights reserved.