即使出现错误,仍继续使用python脚本
我有一个Python脚本记录我房间的温度,并使用请求库发送数据。有时我会丢失wifi信号,请求出错后脚本会完全停止即使出现错误,仍继续使用python脚本,python,python-2.7,Python,Python 2.7,我有一个Python脚本记录我房间的温度,并使用请求库发送数据。有时我会丢失wifi信号,请求出错后脚本会完全停止 import sys import time import Adafruit_DHT import requests raspid = 1 sensor = 11 pin = 25 while True: humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) if humidity is
import sys
import time
import Adafruit_DHT
import requests
raspid = 1
sensor = 11
pin = 25
while True:
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
datos = {'temperatura': 'temperature', 'humedad': 'humidity', 'raspid': 'raspid'}
r = requests.post("http://httpbin.org/post", data=datos)
print(r.text)
else:
print ('Error de lectura!')
time.sleep(15)
断开wifi连接时出错
Traceback (most recent call last):
File "/home/pi/Desktop/dht11 request post.py", line 19, in <module>
r = requests.post("http://mehr.cl/link.php", data=datos)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 94, in post
return request('post', url, data=data, json=json, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 49, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 457, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 569, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 407, in send
raise ConnectionError(err, request=request)
ConnectionError: ('Connection aborted.', error(101, 'Network is unreachable'))
>>>
回溯(最近一次呼叫最后一次):
文件“/home/pi/Desktop/dht11 request post.py”,第19行,在
r=请求。post(“http://mehr.cl/link.php,数据=datos)
文件“/usr/lib/python2.7/dist-packages/requests/api.py”,第94行,在post中
返回请求('post',url,data=data,json=json,**kwargs)
文件“/usr/lib/python2.7/dist-packages/requests/api.py”,第49行,在请求中
return session.request(method=method,url=url,**kwargs)
文件“/usr/lib/python2.7/dist packages/requests/sessions.py”,请求中的第457行
resp=自我发送(准备,**发送)
文件“/usr/lib/python2.7/dist packages/requests/sessions.py”,第569行,在send中
r=适配器.send(请求,**kwargs)
文件“/usr/lib/python2.7/dist packages/requests/adapters.py”,第407行,在send中
raise CONNECTIONERR(错误,请求=请求)
ConnectionError:(“连接已中止”,错误(101,“网络无法访问”))
>>>
有没有办法忽略错误,然后再试一次?有。它正是在尝试,并捕捉任何出现的错误 下面是它的基本工作原理:
try:
# Some action that could raise an error
except:
# What to do when an error occurs
有关更深入的解释,请查看文档:
有几个内置异常,其中,ConnectionError
。如果您知道预期的确切异常,则必须将其添加到except
子句中:
try:
# Actions that might raise a ConnectionError
except ConnectionError:
# Process the error, for instance, try again
您可能需要使用语句。如下
while True:
try:
#action which may create an error
except Exception as exc:
print('[!!!] {err}'.format(err=exc))
#action to perform: Nothing in your case
请注意,一个好的做法是避免错误
在评论中讨论之后,还要注意,如果您使用
异常
来处理错误,您仍然可以在时手动停止循环,因为您使用的是python27。您可以将循环包装在try语句中
while True:
try:
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
datos = {'temperatura': 'temperature', 'humedad': 'humidity', 'raspid': 'raspid'}
r = requests.post("http://httpbin.org/post", data=datos)
print(r.text)
else:
print ('Error de lectura!')
time.sleep(15)
sys.exit(1)
except ConnectionError:
continue
通过这样做,您的代码将逃避错误,从而防止它在您失去连接时停止。使用语句。只需在post
行周围放置异常处理程序。可能特别是除了ConnectionError之外:在Python27中未定义ConnectionError,OP正在使用的版本。@Tnerual,您可以告诉我如何使用它?@OmidCompSCI检查回溯;)@t尽管如此,回溯看起来像是定义了ConnectionError
。至少在Python3中,如果异常不是内置的,则回溯会以模块名作为其前缀,反之,对于良好实践而言,exception
不应被捕获,因为它包括KeyboardInterrupt
。如果后者被捕获并作为正常异常处理,您将无法手动停止执行。@Rightleg。很高兴知道。哪一个政治公众人物?我会说,能够手动停止代码似乎很好。你不这么认为吗?我想不出一个政治公众人物,但这很合乎逻辑。我看不到任何情况下你不希望你的程序被键盘打断。。。尽管这种情况可能会发生,但仍然不太可能。此外,捕捉KeyboardInterrupt
会使您无法手动停止程序,因为它会将执行流带入except
子句,当您想要停止执行流时,程序将从except
子句的末尾继续运行。@Rightleg。啊,好吧,我们说同样的话。我应该先把你的评论读清楚。但你也是。在Python27中,键盘中断不再(再?)通过异常捕获。即不包括在例外情况中
。