Python基于requests检测URL时try/except块失效、合法URL无预期输出求解
IsItDown.py 运行异常问题排查
导致try/except块失效的核心错误
- 状态码读取写法错误:
url_check函数内判断逻辑写错了属性路径,原本写的resp.requests.status_code == 200在执行时会直接抛出AttributeError。因为你用了无类型限制的裸except块,这个异常会被直接兜底捕获,程序会跳过所有正常的状态码判断流程,不管实际请求是否成功,都直接走到except分支打印URL不可访问,看起来就像try/except完全没有按预期工作。 - 裸except的设计缺陷:没有指定具体捕获的异常类型,会覆盖所有运行时错误,同时没有打印具体错误信息,导致你无法感知try块内部抛出的具体异常,定位问题的难度大幅提升。
其他影响程序正常运行的逻辑缺陷
- 无效URL校验逻辑控制流错误:检测到URL不含
.时用了break,会直接跳出整个遍历URL的for循环,而非跳过当前无效项。比如输入baidu.com, abc这类多URL内容时,碰到无效的abc会直接中断后续检测流程,跳转到重启询问环节。 - 清屏逻辑平台不兼容:
os.system('clear')仅支持Linux、macOS系统,Windows环境下执行会报错,无法实现清屏效果。 - 请求无超时控制:调用
requests.get时没有设置超时阈值,碰到无响应的站点时程序会永久卡住,表现为程序假死。 - 重启逻辑存在递归溢出风险:用户连续输入非y/n的选项时,
restart函数会递归调用自身,当递归深度超过Python默认限制时会直接报错崩溃。
修正参考代码
修正后的核心检测函数
def url_check(url): try: # 增加5秒超时避免程序卡死 resp = requests.get(url, timeout=5) # 修正状态码读取路径 if resp.status_code == 200: print(f">>> {url} is up!") else: print(f">>> {url} is down!") # 明确捕获requests模块的常见请求异常,避免兜底所有错误 except requests.exceptions.RequestException as e: print(f">>> {url} is down!") return
主循环逻辑调整要点
- 将无效URL分支里的
break改为continue,实现跳过当前无效URL、继续检测后续URL的效果 - 清屏逻辑可做跨平台适配:替换为
os.system('cls' if os.name == 'nt' else 'clear') - 重启函数的递归逻辑可改为循环判断,避免递归溢出
内容的提问来源于stack exchange,提问作者blaqkippah
相关产品推荐
相关产品推荐

