summaryrefslogtreecommitdiff
path: root/dbus/_dbus.py
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2007-02-19 14:17:08 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2007-02-19 14:17:08 +0000
commit4f88700588d80861c8520e56407d3a40d5bd86e6 (patch)
tree0060be4dda7ac25824797361a4d40a27ee439775 /dbus/_dbus.py
parenta79f8dacbf86efce563cc29104bbacecb5ef9739 (diff)
downloaddbus-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.py54
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):