From 4f88700588d80861c8520e56407d3a40d5bd86e6 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 19 Feb 2007 14:17:08 +0000 Subject: [PATCH] dbus/_dbus.py: When an exception is raised by a signal handler, print it to stderr --- dbus/_dbus.py | 54 ++++++++++++++++++++++++++++++++---------------------- 1 file 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): -- 2.11.4.GIT