-
-
Save CrumblyLiquid/65127f1f45673b1d1add60daae2c80dd to your computer and use it in GitHub Desktop.
Simple Error Handling for ext.commands - discord.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import traceback | |
import sys | |
from discord.ext import commands | |
import discord | |
""" | |
If you are not using this inside a cog, add the event decorator e.g: | |
@bot.event | |
async def on_command_error(ctx, error) | |
For examples of cogs see: | |
Rewrite: | |
https://gist.github.com/EvieePy/d78c061a4798ae81be9825468fe146be | |
Async: | |
https://gist.github.com/leovoel/46cd89ed6a8f41fd09c5 | |
This example uses @rewrite version of the lib. For the async version of the lib, simply swap the places of ctx, and error. | |
e.g: on_command_error(self, error, ctx) | |
For a list of exceptions: | |
http://discordpy.readthedocs.io/en/rewrite/ext/commands/api.html#errors | |
""" | |
class CommandErrorHandler(commands.Cog): | |
def __init__(self, bot): | |
self.bot = bot | |
@commands.Cog.listener() | |
async def on_command_error(self, ctx, error): | |
"""The event triggered when an error is raised while invoking a command. | |
ctx : Context | |
error : Exception""" | |
# This prevents any commands with local handlers being handled here in on_command_error. | |
if hasattr(ctx.command, 'on_error'): | |
return | |
ignored = (commands.CommandNotFound, commands.UserInputError) | |
# Allows us to check for original exceptions raised and sent to CommandInvokeError. | |
# If nothing is found. We keep the exception passed to on_command_error. | |
error = getattr(error, 'original', error) | |
# Anything in ignored will return and prevent anything happening. | |
if isinstance(error, ignored): | |
return | |
elif isinstance(error, commands.DisabledCommand): | |
return await ctx.send(f'{ctx.command} has been disabled.') | |
elif isinstance(error, commands.NoPrivateMessage): | |
try: | |
return await ctx.author.send(f'{ctx.command} can not be used in Private Messages.') | |
except: | |
pass | |
# For this error example we check to see where it came from... | |
elif isinstance(error, commands.BadArgument): | |
if ctx.command.qualified_name == 'tag list': # Check if the command being invoked is 'tag list' | |
return await ctx.send('I could not find that member. Please try again.') | |
# All other Errors not returned come here... And we can just print the default TraceBack. | |
print('Ignoring exception in command {}:'.format(ctx.command), file=sys.stderr) | |
traceback.print_exception(type(error), error, error.__traceback__, file=sys.stderr) | |
"""Below is an example of a Local Error Handler for our command do_repeat""" | |
@commands.command(name='repeat', aliases=['mimic', 'copy']) | |
async def do_repeat(self, ctx, *, inp: str): | |
"""A simple command which repeats your input! | |
inp : The input to be repeated""" | |
await ctx.send(inp) | |
@do_repeat.error | |
async def do_repeat_handler(self, ctx, error): | |
"""A local Error Handler for our command do_repeat. | |
This will only listen for errors in do_repeat. | |
The global on_command_error will still be invoked after.""" | |
# Check if our required argument inp is missing. | |
if isinstance(error, commands.MissingRequiredArgument): | |
if error.param.name == 'inp': | |
await ctx.send("You forgot to give me input to repeat!") | |
def setup(bot): | |
bot.add_cog(CommandErrorHandler(bot)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import traceback | |
import sys | |
from discord.ext import commands | |
import discord | |
class CommandErrorHandler(commands.Cog): | |
def __init__(self, bot): | |
self.bot = bot | |
@commands.Cog.listener() | |
async def on_command_error(self, ctx, error): | |
"""The event triggered when an error is raised while invoking a command. | |
ctx : Context | |
error : Exception""" | |
if hasattr(ctx.command, 'on_error'): | |
return | |
ignored = (commands.CommandNotFound, commands.UserInputError) | |
error = getattr(error, 'original', error) | |
if isinstance(error, ignored): | |
return | |
elif isinstance(error, commands.DisabledCommand): | |
return await ctx.send(f'{ctx.command} has been disabled.') | |
elif isinstance(error, commands.NoPrivateMessage): | |
try: | |
return await ctx.author.send(f'{ctx.command} can not be used in Private Messages.') | |
except: | |
pass | |
elif isinstance(error, commands.BadArgument): | |
if ctx.command.qualified_name == 'tag list': | |
return await ctx.send('I could not find that member. Please try again.') | |
print('Ignoring exception in command {}:'.format(ctx.command), file=sys.stderr) | |
traceback.print_exception(type(error), error, error.__traceback__, file=sys.stderr) | |
@commands.command(name='repeat', aliases=['mimic', 'copy']) | |
async def do_repeat(self, ctx, *, inp: str): | |
await ctx.send(inp) | |
@do_repeat.error | |
async def do_repeat_handler(self, ctx, error): | |
if isinstance(error, commands.MissingRequiredArgument): | |
if error.param.name == 'inp': | |
await ctx.send("You forgot to give me input to repeat!") | |
def setup(bot): | |
bot.add_cog(CommandErrorHandler(bot)) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment