Sag*_*gre 5 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()
Run Code Online (Sandbox Code Playgroud)
这是向主题“ test”发送消息时的输出:
Connected to broker with result code 0
Recieved message on test
Invoke func
Run Code Online (Sandbox Code Playgroud)
从main调用func()时,我抛出了正确的TypeError。所以有些东西在paho中捕获了此异常。我看了一个较旧的项目(虽然是python2),并试图重新创建该行为。在那里正确抛出了异常。我想念什么?
编辑 我可以通过将func()调用放在try块中来捕获异常。但是,如果未被捕获,它不会停止程序的执行。我不明白为什么
对于遇到此问题并想知道为什么不抛出mqtt回调中的所有异常或至少不可见的任何人:与paho的python2版本相反,客户端已经捕获了调用用户集回调时发生的所有异常功能。然后,此catch的输出将输出到on_log回调函数。如果用户未执行此操作,则不会显示可见的输出。所以只需添加
def on_log(client, userdata, level, buff):
Run Code Online (Sandbox Code Playgroud)
到您的代码,您可以在其中打印出异常描述
这是因为该on_message
函数是由网络线程调用的,并且它将将该调用包装在一个try
块中以阻止错误on_message
停止该线程。
如果您希望出现错误来停止应用程序,那么您应该使用自己的try
块on_message
并采取适当的行为。