如何在Discord.py bot中通过GSpread校验用户是否已注册?
解决Discord.py机器人结合GSpread校验用户时的异常问题
我一眼就看出问题所在啦——你用的gspread的find()方法,在找不到匹配内容的时候不会返回None,而是会直接抛出CellNotFound异常,这就是为什么删除用户名后代码会崩溃的原因!原来的if/else逻辑根本没机会处理“找不到”的情况,因为异常直接打断了代码执行。
下面给你两种靠谱的解决思路:
方法1:用try-except捕获异常
这是最直接适配你原有逻辑的方式,专门捕获find()抛出的异常,在异常分支里处理“用户未找到”的情况:
from gspread.exceptions import CellNotFound @bot.command() async def finduser(message): user = message.author.name + message.author.discriminator print(user) try: findUser = sheet.find(user, in_column=3) print("User found!") except CellNotFound: print("User not found!")
方法2:改用findall()方法
findall()方法在找不到匹配项时会返回一个空列表,空列表在布尔判断里等价于False,这样就能用你原来的if/else逻辑了:
@bot.command() async def finduser(message): user = message.author.name + message.author.discriminator print(user) findUsers = sheet.findall(user, in_column=3) if findUsers: # 空列表会被判定为False print("User found!") else: print("User not found!")
两种方法都能解决你的问题,选哪个看你自己的习惯~如果只需要匹配单个用户,两种都没问题;如果可能有多个重复用户名,findall()还能帮你拿到所有匹配结果。
内容的提问来源于stack exchange,提问作者ekalb2020




