Python开发Discord机器人:图片不存在时控制台报错问题求助
Discord机器人处理无效图片时控制台报错的解决方案
你的问题出在这几个核心点:
- 仅通过HTTP状态码判断请求成功,但状态码200不代表返回的是有效图片——如果返回的是错误页面或非图片数据,
Image.open()会直接抛出异常,导致控制台报错。 - 重复调用
requests.get(url),既浪费网络资源,也可能出现两次请求结果不一致的情况。 - 未处理网络请求本身可能出现的异常(比如连接超时、DNS解析失败等)。
修复后的代码如下:
import requests import io from PIL import Image from discord_slash import SlashCommand, SlashContext, create_option import discord slash = SlashCommand(bot, sync_commands=True) @slash.slash( name="vistaprevia", description="Escribe él ID de la url de imgur", options=[ create_option( name="id_imgur", description="Escribe él ID de la url de imgur", option_type=3, required=True ), ]) async def vistaprevia(ctx:SlashContext, id_imgur:str): await ctx.defer() url = f"https://jose89fcb.es/SkinMinecraftVistaPreviaDiscord/skin.php?skin={id_imgur}" try: # 仅发起一次请求,避免重复调用浪费资源 r = requests.get(url) r.raise_for_status() # 自动捕获4xx/5xx类HTTP错误 # 尝试解析并处理图片 imagen = Image.open(io.BytesIO(r.content)) with io.BytesIO() as imagen_binary: imagen.save(imagen_binary, 'PNG') imagen_binary.seek(0) await ctx.send(file=discord.File(fp=imagen_binary, filename=f"{id_imgur}.png")) except requests.exceptions.RequestException as e: # 处理网络请求或HTTP状态码错误 await ctx.send("Error de imagen!") print(f"网络请求错误: {str(e)}") except Exception as e: # 处理图片解析失败的其他异常(比如非图片格式数据) await ctx.send("Error de imagen!") print(f"图片解析错误: {str(e)}")
关键修复说明:
- 用
r.raise_for_status()替代手动判断状态码,自动捕获所有HTTP错误状态。 - 合并
requests.get调用,复用请求结果,避免重复请求的不确定性。 - 通过双层异常捕获覆盖所有可能的错误场景:
requests.exceptions.RequestException:覆盖网络连接失败、超时、HTTP错误等所有请求类问题。- 通用
Exception:捕获图片格式无效、解析失败等异常。
- 异常发生时,既给Discord用户返回统一提示,也在控制台打印具体错误信息方便排查。
内容的提问来源于stack exchange,提问作者juancarlos5487
相关产品推荐
相关产品推荐

