diff options
| author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2007-02-19 14:17:08 +0000 |
|---|---|---|
| committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2007-02-19 14:17:08 +0000 |
| commit | 4f88700588d80861c8520e56407d3a40d5bd86e6 (patch) | |
| tree | 0060be4dda7ac25824797361a4d40a27ee439775 /dbus/_dbus.py | |
| parent | a79f8dacbf86efce563cc29104bbacecb5ef9739 (diff) | |
| download | dbus-python-4f88700588d80861c8520e56407d3a40d5bd86e6.tar.gz | |
dbus/_dbus.py: When an exception is raised by a signal handler, print it to stderr
Diffstat (limited to 'dbus/_dbus.py')
| -rw-r--r-- | dbus/_dbus.py | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/dbus/_dbus.py b/dbus/_dbus.py index 21ed122..8e3b536 100644 --- a/dbus/_dbus.py +++ b/dbus/_dbus.py @@ -33,7 +33,9 @@ BusImplementation = _dbus_bindings.BusImplementation import os import logging +import sys import weakref +from traceback import print_exc from dbus.proxies import ProxyObject, BUS_DAEMON_NAME, BUS_DAEMON_PATH, \ BUS_DAEMON_IFACE @@ -187,28 +189,36 @@ class SignalMatch(object): return False #logger.debug('%r: yes, I want to handle that signal', self) - # minor optimization: if we already extracted the args with the right - # calling convention to do the args match, don't bother doing so again - if args is None or not self._utf8_strings or not self._byte_arrays: - args = message.get_args_list(utf8_strings=self._utf8_strings, - byte_arrays=self._byte_arrays) - #logger.debug('%r: extracted signal arguments', self) - kwargs = {} - if self._sender_keyword is not None: - kwargs[self._sender_keyword] = message.get_sender() - if self._destination_keyword is not None: - kwargs[self._destination_keyword] = message.get_destination() - if self._path_keyword is not None: - kwargs[self._path_keyword] = message.get_path() - if self._member_keyword is not None: - kwargs[self._member_keyword] = message.get_member() - if self._interface_keyword is not None: - kwargs[self._interface_keyword] = message.get_interface() - if self._message_keyword is not None: - kwargs[self._message_keyword] = message - #logger.debug('%r: calling handler with %r and %r', self, args, kwargs) - self._handler(*args, **kwargs) - #logger.debug('%r: signal handled', self) + + try: + # minor optimization: if we already extracted the args with the right + # calling convention to do the args match, don't bother doing so again + if args is None or not self._utf8_strings or not self._byte_arrays: + args = message.get_args_list(utf8_strings=self._utf8_strings, + byte_arrays=self._byte_arrays) + #logger.debug('%r: extracted signal arguments', self) + kwargs = {} + if self._sender_keyword is not None: + kwargs[self._sender_keyword] = message.get_sender() + if self._destination_keyword is not None: + kwargs[self._destination_keyword] = message.get_destination() + if self._path_keyword is not None: + kwargs[self._path_keyword] = message.get_path() + if self._member_keyword is not None: + kwargs[self._member_keyword] = message.get_member() + if self._interface_keyword is not None: + kwargs[self._interface_keyword] = message.get_interface() + if self._message_keyword is not None: + kwargs[self._message_keyword] = message + #logger.debug('%r: calling handler with %r and %r', self, args, kwargs) + self._handler(*args, **kwargs) + #logger.debug('%r: signal handled', self) + except: + # FIXME: need to decide whether dbus-python uses logging, or + # stderr, or what, and make it consistent + sys.stderr.write('Exception in handler for D-Bus signal:\n') + print_exc() + return True def remove(self): |
