Python 判断网络是否正常及代码修改
def isConnected(self):
try:
requests.get("http://www.baidu.com", timeout=2)
except:
print("网络异常")
time.sleep(10)
return False
return True
def checking(self): # 一直检测是否有断网,若是断网则从新链接
while 1:
try:
if self.isConnected():
self.adb_install()
except:
time.sleep(10)
def adb_install(self):
try:
print("正在安装...")
except:
self.checking()
- 最近想给自己的下载脚本添加一个网络判断的功能,于是在网上搜到了这段代码,于是就走上了改这段代码的bug的路上越走越远…🤦♀️
- 先说一个需要注意的,就是adb_install的主函数的try需要包括这个函数的所有代码,否则会进入网络判断出来后,还会执行剩下的代码;
- 第二点,这串代码最奇葩的点,还有个死循环;在checking函数里面while 1进入循环后没有任何情况跳出循环,沿江东路站到了🚌
修改后:
def checking(self): # 一直检测是否有断网,若是断网则从新链接
while 1:
if self.isConnected():
self.adb_install()
break
- 第三点,更更奇葩的点,是这段代码没有判断错误,不论任何错误都进入了判断网络,而不论什么错误都会返回网络异常;一切手动停止的操作也会进入网络错误而循环…
修改后(把指定错误抛出):
def isConnected(self):
try:
requests.get("http://www.baidu.com/", verify=False, timeout=1)
except requests.exceptions.ReadTimeout:
print("连接超时,10s后重试")
time.sleep(10)
return False
except requests.exceptions.ConnectionError:
print("网络异常,10s后重试")
time.sleep(10)
return False
return True
- 为了解决在任何时刻都可能执行手动停止,我灵光一现,想到了装饰器👏
def Interrupt_exception(func):
def wrapper(*args, **kwargs):
try:
func(*args, **kwargs)
except KeyboardInterrupt:
print("手动停止")
os._exit(0)
return wrapper
- 修改完之后,发现代码一旦进入checking就会一直进入网络异常,发现用了装饰器后没有返回执行checking的值,加上:
def Interrupt_exception(func):
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
return result
except KeyboardInterrupt:
print("手动停止")
os._exit(0)
return wrapper
- 以上,大概代码修改完成,其他优化。