如何捕获telegram_send无网络连接时抛出的异常?
解决telegram_send断网时的异常捕获问题
当你断开网络运行脚本时,直接捕获socket.gaierror无效,是因为telegram_send底层依赖requests库,网络异常会被requests封装为自身的异常类型,而非直接抛出socket层的原始异常。以下是具体解决方法:
1. 先确定具体异常类型
如果不确定要捕获哪种异常,可以先临时捕获所有异常,打印出异常的类型和详情:
import telegram_send try: telegram_send.send(messages=['OI!']) except Exception as e: print(f"异常类型: {type(e).__name__}") print(f"异常信息: {str(e)}") # 查看底层嵌套的原始异常 if hasattr(e, '__cause__') and e.__cause__: print(f"底层异常: {type(e.__cause__).__name__}: {str(e.__cause__)}")
断网运行后,你会发现抛出的是requests.exceptions.ConnectionError,其底层才是socket.gaierror。
2. 针对性捕获异常
直接捕获requests库的网络连接异常即可覆盖断网场景:
import telegram_send from requests.exceptions import ConnectionError, RequestException try: telegram_send.send(messages=['OI!']) except ConnectionError: print('没有网络连接,请检查网络状态。') # 可选:捕获所有请求相关异常,处理其他可能的请求失败情况 except RequestException as e: print(f"请求发送失败: {str(e)}")
3. 捕获底层socket异常(可选)
如果你一定要捕获socket.gaierror,可以通过异常的__cause__属性判断:
import telegram_send import socket try: telegram_send.send(messages=['OI!']) except Exception as e: if isinstance(e.__cause__, socket.gaierror): print('DNS解析失败(无网络或域名错误)') else: # 处理其他异常 print(f"未知错误: {str(e)}")
不过这种方式不如直接捕获ConnectionError简洁,推荐使用第二种方案。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

