diff --git a/discord/client.py b/discord/client.py index 2e783d09a..8b7965bb8 100644 --- a/discord/client.py +++ b/discord/client.py @@ -38,7 +38,7 @@ import json, re, time, copy from collections import deque from threading import Timer from ws4py.client.threadedclient import WebSocketClient -from sys import platform as sys_platform +import sys def _null_event(*args, **kwargs): pass @@ -197,7 +197,8 @@ class Client(object): try: self.events[event_name](*args, **kwargs) except Exception as e: - pass + self.events['error'](event_name, *sys.exc_info()) + def _received_message(self, msg): response = json.loads(str(msg)) @@ -511,7 +512,7 @@ class Client(object): 'd': { 'token': self.token, 'properties': { - '$os': sys_platform, + '$os': sys.platform, '$browser': 'discord.py', '$device': 'discord.py', '$referrer': '', diff --git a/docs/api.rst b/docs/api.rst index 945f34e68..0081f29ea 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -30,6 +30,19 @@ All events are 'sandboxed', in that if an exception is thrown while the event is Called when the client disconnects for whatever reason. Be it error or manually. +.. function:: on_error(event, type, value, traceback) + + Usually when an event throws an uncaught exception, it is swallowed. If you want to handle + the uncaught exceptions for whatever reason, this event is called. If an exception is thrown + on this event then it propagates (i.e. it is not swallowed silently). + + The parameters for this event are retrieved through the use of ``sys.exc_info()``. + + :param event: The event name that had the uncaught exception. + :param type: The type of exception that was swallowed. + :param value: The actual exception that was swallowed. + :param traceback: The traceback object representing the traceback of the exception swallowed. + .. function:: on_message(message) Called when a message is created and sent to a server.