# Buggy code
def run_async(self, func, *args, **kwargs):
    """Queue a function (with given args/kwargs) to be run asynchronously.

    Warning:
        If you're using @run_async you cannot rely on adding custom attributes to
        :class:`telegram.ext.CallbackContext`. See its docs for more info.

    Args:
        func (:obj:`callable`): The function to run in the thread.
        *args (:obj:`tuple`, optional): Arguments to `func`.
        **kwargs (:obj:`dict`, optional): Keyword arguments to `func`.

    Returns:
        Promise

    """
    # TODO: handle exception in async threads
    #       set a threading.Event to notify caller thread
    promise = Promise(func, args, kwargs)
    self.__async_queue.put(promise)
    return promise


# Traceback (telegram.error.BadRequest)
<project_path>/venv/bin/python <project_path>/issue.py
2017-06-20 23:24:11,743 - __main__ - INFO - /start
2017-06-20 23:24:11,906 - telegram.ext.dispatcher - WARNING - A TelegramError was raised while processing the Update.
2017-06-20 23:24:11,907 - __main__ - ERROR - Boom!
2017-06-20 23:24:11,907 - __main__ - INFO - /async_start
2017-06-20 23:24:12,188 - telegram.utils.promise - ERROR - An uncaught error was raised while running the promise
Traceback (most recent call last):
File "<project_path>/venv/src/python-telegram-bot/telegram/utils/promise.py", line 42, in run
self._result = self.pooled_function(*self.args, **self.kwargs)
File "<project_path>/issue.py", line 25, in action_async_start
update.message.reply_text(msg, parse_mode=ParseMode.HTML)
File "<project_path>/venv/src/python-telegram-bot/telegram/message.py", line 340, in reply_text
return self.bot.send_message(self.chat_id, *args, **kwargs)
File "<project_path>/venv/src/python-telegram-bot/telegram/bot.py", line 125, in decorator
result = func(self, *args, **kwargs)
File "<project_path>/venv/src/python-telegram-bot/telegram/bot.py", line 158, in decorator
return Bot._message_wrapper(self, url, data, *args, **kwargs)
File "<project_path>/venv/src/python-telegram-bot/telegram/bot.py", line 146, in _message_wrapper
result = self._request.post(url, data, timeout=kwargs.get('timeout'))
File "<project_path>/venv/src/python-telegram-bot/telegram/utils/request.py", line 252, in post
**urlopen_kwargs)
File "<project_path>/venv/src/python-telegram-bot/telegram/utils/request.py", line 194, in _request_wrapper
raise BadRequest(message)
telegram.error.BadRequest: Can't parse entities in message text: unsupported start tag "invalid_tag" at byte offset 0

Process finished with exit code 0

# Fixed code
def run_async(self, func, *args, update=None, **kwargs):
    """
    Queue a function (with given args/kwargs) to be run asynchronously. Exceptions raised
    by the function will be handled by the error handlers registered with
    :meth:`add_error_handler`.

    Warning:
        * If you're using ``@run_async``/:meth:`run_async` you cannot rely on adding custom
          attributes to :class:`telegram.ext.CallbackContext`. See its docs for more info.
        * Calling a function through :meth:`run_async` from within an error handler can lead to
          an infinite error handling loop.

    Args:
        func (:obj:`callable`): The function to run in the thread.
        *args (:obj:`tuple`, optional): Arguments to ``func``.
        update (:class:`telegram.Update`, optional): The update associated with the functions
            call. If passed, it will be available in the error handlers, in case an exception
            is raised by :attr:`func`.
        **kwargs (:obj:`dict`, optional): Keyword arguments to ``func``.

    Returns:
        Promise

    """
    return self._run_async(func, *args, update=update, error_handling=True, **kwargs)