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

时间:2018-09-20 13:56:23

标签: python exception mqtt paho

我尝试在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中捕获了此异常。我看了一个较旧的项目(虽然是python2),并试图重新创建该行为。在那里正确抛出了异常。我想念什么?

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

3 个答案:

答案 0 :(得分:4)

对于遇到此问题并想知道为什么不抛出mqtt回调中的所有异常或至少不可见的任何人:与paho的python2版本相反,客户端已经捕获了调用on时发生的所有异常。用户设置回调函数。然后,此catch的输出将输出到on_log回调函数。如果用户未执行此操作,则不会显示可见的输出。因此,只需添加

aws cloudformation deploy --stack-name pre-reqs \
--template-file ToolsAcct/pre-reqs.yaml \
--parameter-overrides CodeBuildCondition=true

在您的代码中,您可以在其中打印出异常描述

答案 1 :(得分:2)

这是由于以下事实:on_message函数是由网络线程调用的,它将把该调用包装在try块中,以阻止on_message中的错误停止该线程。

如果您想出错以停止应用程序,则应在try中使用自己的on_message块并适当执行操作。

答案 2 :(得分:0)

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

import traceback

def on_message(client, userdata, msg):
    try:
        do_something(msg)
    except:
        traceback.print_exc()
        quit(0)