python-telegram-bot/examples/errorhandlerbot.py

93 lines
3.3 KiB
Python
Raw Normal View History

Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
#!/usr/bin/env python
# pylint: disable=C0116
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
# This program is dedicated to the public domain under the CC0 license.
"""
This is a very simple example on how one could implement a custom error handler
"""
import html
import json
import logging
import traceback
from telegram import Update, ParseMode
from telegram.ext import Updater, CallbackContext, CommandHandler
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO
)
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
logger = logging.getLogger(__name__)
# The token you got from @botfather when you created the bot
BOT_TOKEN = "TOKEN"
# This can be your own ID, or one for a developer group/channel.
# You can use the /start command of this bot to see your chat id.
DEVELOPER_CHAT_ID = 123456789
def error_handler(update: object, context: CallbackContext) -> None:
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
"""Log the error and send a telegram message to notify the developer."""
# Log the error before we do anything else, so we can see it even if something breaks.
logger.error(msg="Exception while handling an update:", exc_info=context.error)
# traceback.format_exception returns the usual python message about an exception, but as a
# list of strings rather than a single string, so we have to join them together.
tb_list = traceback.format_exception(None, context.error, context.error.__traceback__)
tb_string = ''.join(tb_list)
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
# Build the message with some markup and additional information about what happened.
# You might need to add some logic to deal with messages longer than the 4096 character limit.
update_str = update.to_dict() if isinstance(update, Update) else str(update)
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
message = (
2020-11-23 22:09:29 +01:00
f'An exception was raised while handling an update\n'
f'<pre>update = {html.escape(json.dumps(update_str, indent=2, ensure_ascii=False))}'
2020-11-23 22:09:29 +01:00
'</pre>\n\n'
f'<pre>context.chat_data = {html.escape(str(context.chat_data))}</pre>\n\n'
f'<pre>context.user_data = {html.escape(str(context.user_data))}</pre>\n\n'
f'<pre>{html.escape(tb_string)}</pre>'
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
)
# Finally, send the message
context.bot.send_message(chat_id=DEVELOPER_CHAT_ID, text=message, parse_mode=ParseMode.HTML)
def bad_command(_: Update, context: CallbackContext) -> None:
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
"""Raise an error to trigger the error handler."""
context.bot.wrong_method_name() # type: ignore[attr-defined]
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
def start(update: Update, _: CallbackContext) -> None:
update.effective_message.reply_html(
'Use /bad_command to cause an error.\n'
2020-11-23 22:09:29 +01:00
f'Your chat id is <code>{update.effective_chat.id}</code>.'
)
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
def main() -> None:
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
# Create the Updater and pass it your bot's token.
Doc Fixes (#2253) * Render-fixes for BP * docs: fix simple typo, submition -> submission (#2260) There is a small typo in tests/test_bot.py. Should read `submission` rather than `submition`. * Type on rawapibot.py docstring * typo * Typo: Filters.document(s) * Typo fix * Doc fix for messageentity (#2311) * Add New Shortcuts to Chat (#2291) * Add shortcuts * Add a note * Add run_async Parameter to ConversationHandler (#2292) * Add run_async parameter * Update docstring * Update test to explicitly specify parameter * Fix test job queue * Add version added tag to docs * Update docstring Co-authored-by: Poolitzer <25934244+Poolitzer@users.noreply.github.com> * Doc nitpicking Co-authored-by: Poolitzer <25934244+Poolitzer@users.noreply.github.com> Co-authored-by: Hinrich Mahler <hinrich.mahler@freenet.de> * Fix rendering in messageentity Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de> Co-authored-by: zeshuaro <joshuaystang@gmail.com> Co-authored-by: Poolitzer <25934244+Poolitzer@users.noreply.github.com> * fix: type hints for TelegramError changed :class:`telegram.TelegramError` to :class:`telegram.error.TelegramError` * fix: the error can be more then just a Telegram error * Doc fix for inlinekeyboardbutton.py added missing colon which broke rendering * fix: remove context argument and doc remark look at us already being in post 12 * use rtd badge * filters doc fixes * fix some rendering * Doc & Rendering fixes for helpers.py Co-authored-by: Tim Gates <tim.gates@iress.com> Co-authored-by: Harshil <37377066+harshil21@users.noreply.github.com> Co-authored-by: zeshuaro <joshuaystang@gmail.com> Co-authored-by: Poolitzer <25934244+Poolitzer@users.noreply.github.com> Co-authored-by: Harshil <ilovebhagwan@gmail.com>
2021-02-01 17:59:39 +01:00
updater = Updater(BOT_TOKEN)
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
# Get the dispatcher to register handlers
dispatcher = updater.dispatcher
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
# Register the commands...
dispatcher.add_handler(CommandHandler('start', start))
dispatcher.add_handler(CommandHandler('bad_command', bad_command))
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
# ...and the error handler
dispatcher.add_error_handler(error_handler)
Add standalone example on error handlers (#1983) * Remove error handlers from examples Most examples use the same error handler, that error handler logs update.to_dict but doesn't log error traceback. Hiding error traceback is quite bad, removing the error handler entirely causes PTB to use default error logging which does include error traceback. * adding error handling example * Change error handler example Including: - Change the telegram message to include usual python error message. - HTML-escape the strings used to build the telegram message. - Capitalize comments and add more empty lines to hopefully unify the style with other examples, at least a bit. - Reorder imports. * Add an error-rising command to the error handler example * Slightly change example error handler docstring and comments * Make telegram message sent by the error handler example more readable * Rename error_handler.py to errorhandlerbot.py and add a start command * Change error handler example to work without developer chat id * Revert "Change error handler example to work without developer chat id" This reverts commit c4efea6f * Make bot token a module level constant in the error handler example Otherwise the example will require two edits 40 lines apart to run. * Show chat id in start command of the error handler example The example requires you to set developer chat id, this change will make things easier for users that don't know how to see their chat id. * Add errorhandlerbot.py to the examples folder readme Co-authored-by: poolitzer <25934244+poolitzer@users.noreply.github.com> Co-authored-by: Bibo-Joshi <hinrich.mahler@freenet.de>
2020-06-12 18:50:12 +02:00
# Start the Bot
updater.start_polling()
# Run the bot until you press Ctrl-C or the process receives SIGINT,
# SIGTERM or SIGABRT. This should be used most of the time, since
# start_polling() is non-blocking and will stop the bot gracefully.
updater.idle()
if __name__ == '__main__':
main()