即使出现错误,仍继续使用python脚本

即使出现错误,仍继续使用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

我有一个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 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中,键盘中断不再(再?)通过
异常捕获。即不包括在
例外情况中