Paho MQTT Python 客户端:没有抛出异常,只是停止
Paho MQTT Python Client: No exceptions thrown, just stops
我尝试在 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 块中来捕获异常。然而,当没有被捕获时,它不会停止程序的执行。我不明白为什么
这是因为 on_message
函数由网络线程调用,它将将该调用包装在 try
块中以阻止 on_message
中的错误从停止那个线程。
如果你想错误地停止应用程序,那么你应该在 on_message
中使用你自己的 try
块并适当地表现。
对于遇到此问题并想知道为什么不抛出或至少不可见 mqtt 回调中的所有异常的任何人:与 python2 版本的 paho 相比,客户端已经捕获了所有异常调用用户设置的回调函数时发生。这个catch的输出然后输出到on_log回调函数。如果这不是由用户实现的,将不会有可见的输出。所以只需添加
def on_log(client, userdata, level, buff):
print(buff)
mqttc.on_log = on_log
到你的代码,打印出异常。
您可以使用 try
+ expect
捕获错误,然后使用回溯手动打印错误消息和指向错误源的指针。与使用 on_log 函数相比,这将为您提供模式详细信息。
import traceback
def on_message(client, userdata, msg):
try:
do_something(msg)
except:
traceback.print_exc()
quit(0)
我尝试在 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 块中来捕获异常。然而,当没有被捕获时,它不会停止程序的执行。我不明白为什么
这是因为 on_message
函数由网络线程调用,它将将该调用包装在 try
块中以阻止 on_message
中的错误从停止那个线程。
如果你想错误地停止应用程序,那么你应该在 on_message
中使用你自己的 try
块并适当地表现。
对于遇到此问题并想知道为什么不抛出或至少不可见 mqtt 回调中的所有异常的任何人:与 python2 版本的 paho 相比,客户端已经捕获了所有异常调用用户设置的回调函数时发生。这个catch的输出然后输出到on_log回调函数。如果这不是由用户实现的,将不会有可见的输出。所以只需添加
def on_log(client, userdata, level, buff):
print(buff)
mqttc.on_log = on_log
到你的代码,打印出异常。
您可以使用 try
+ expect
捕获错误,然后使用回溯手动打印错误消息和指向错误源的指针。与使用 on_log 函数相比,这将为您提供模式详细信息。
import traceback
def on_message(client, userdata, msg):
try:
do_something(msg)
except:
traceback.print_exc()
quit(0)