問題描述
每個人.我一直在為我的不和諧服務器開發一些機器人,但我在其中一個機器人中遇到了一個我似乎無法解決的問題.我有一個名為info"的命令,本質上,該命令顯示有關所需用戶的一些信息.當我調用命令 ?info [user]
時,它工作得很好,直到我故意請求不存在的用戶的信息來測試我已經到位的異常.這里'
everyone. I've been working on a few bots for my discord server and I've come across an issue in one of them which I cant seem to solve. I have a command called 'info', essentially, this command displays some information on a desired user. When I call the command ?info [user]
, it works just fine until I intentionally request the info on a user that doesn't exist to test an exception I have in place. Here'
@laugh.command(pass_context=True)
async def info(ctx, user: discord.Member = None):
if ctx.message.channel.name != "admin":
await laugh.send_message(ctx.message.author, "Sorry, you need to be in a text channel called 'admin' for that.")
return
if not ctx.message.author.server_permissions.administrator:
return
if not user:
user = ctx.message.author
try:
minfo = ("""
{0}'s ID is: {1}
{0}'s status is: {2}
{0}'s highest role is: {3}
{0} joined at: {4}""".format(user.name, user.id, user.status, user.top_role, user.joined_at))
embed = discord.Embed(title = user.name, description = minfo, color = 0x00D2FF)
await laugh.say(embed = embed)
except discord.NotFound:
await laugh.say("User not found.")
當我運行此代碼并將不存在的用戶作為參數時,我的異常不起作用,相反,我將此輸出到我的控制臺:
When I run this code and give a non-existent user as parameters, my exception doesn't work, instead, I get this output to my console:
Ignoring exception in command info
Traceback (most recent call last):
File "C:UsersMatthewAppDataLocalProgramsPythonPython36-32libsite-packagesdiscordextcommandsot.py", line 846, in process_commands
yield from command.invoke(ctx)
File "C:UsersMatthewAppDataLocalProgramsPythonPython36-32libsite-packagesdiscordextcommandscore.py", line 367, in invoke
yield from self.prepare(ctx)
File "C:UsersMatthewAppDataLocalProgramsPythonPython36-32libsite-packagesdiscordextcommandscore.py", line 345, in prepare
yield from self._parse_arguments(ctx)
File "C:UsersMatthewAppDataLocalProgramsPythonPython36-32libsite-packagesdiscordextcommandscore.py", line 304, in _parse_arguments
transformed = yield from self.transform(ctx, param)
File "C:UsersMatthewAppDataLocalProgramsPythonPython36-32libsite-packagesdiscordextcommandscore.py", line 223, in transform
raise e
File "C:UsersMatthewAppDataLocalProgramsPythonPython36-32libsite-packagesdiscordextcommandscore.py", line 221, in transform
return (yield from self.do_conversion(ctx, converter, argument))
File "C:UsersMatthewAppDataLocalProgramsPythonPython36-32libsite-packagesdiscordextcommandscore.py", line 184, in do_conversion
return instance.convert()
File "C:UsersMatthewAppDataLocalProgramsPythonPython36-32libsite-packagesdiscordextcommandsconverter.py", line 100, in convert
raise BadArgument('Member "{}" not found'.format(self.argument))
discord.ext.commands.errors.BadArgument: Member "test" not found
我查看了無數示例和論壇帖子,我獲得的唯一知識是錯誤的根源在于 async def info(ctx, user: discord.Member = None):代碼>,關于我能做什么的任何想法?
I've looked at countless examples and forums posts and the only knowledge I've gained was that the source of the error is in async def info(ctx, user: discord.Member = None):
, any ideas on what I can do?
推薦答案
命令的錯誤處理有點奇怪.當您為參數 user
指定轉換器時,該轉換發生在命令協程的主體之外.要處理它,您必須編寫一個錯誤處理程序協程,并將其與相關命令相關聯.
Error handling for commands is a little weird. When you specify a converter for the argument user
, that conversion takes place outside of the body of the command coroutine. To handle it, you must write an error handler coroutine, and associate it with the command in question.
@laugh.command(pass_context=True)
async def info(ctx, user: discord.Member = None):
if ctx.message.channel.name != "admin":
await laugh.send_message(ctx.message.author, "Sorry, you need to be in a text channel called 'admin' for that.")
return
if not ctx.message.author.server_permissions.administrator:
return
if not user:
user = ctx.message.author
minfo = ("""
{0}'s ID is: {1}
{0}'s status is: {2}
{0}'s highest role is: {3}
{0} joined at: {4}""".format(user.name, user.id, user.status, user.top_role, user.joined_at))
embed = discord.Embed(title = user.name, description = minfo, color = 0x00D2FF)
await laugh.say(embed = embed)
@info.error
async def info_error(ctx, error): # This might need to be (error, ctx), I'm not sure
if isinstance(error, commands.BadArgument):
await laugh.say('I could not find that user')
您可以在 discord.ext.commands 模塊的其余部分rewrite/ext/commands/commands.html#error-handling" rel="nofollow noreferrer">rewrite 分支的文檔.
You can read the documentation for error handlers, and the rest of the discord.ext.commands
module, in the documentation for the rewrite branch.
如果您要使用命令擴展做大量工作,現在轉換您的代碼以便您可以使用準確的文檔可能是有意義的.
If you're going to be doing a lot of work with the commands extension, it may make sense to convert your code now so that you can work with accurate documentation.
這篇關于Discord.py discord.NotFound 異常的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!