diff --git a/electrum/gui/qml/__init__.py b/electrum/gui/qml/__init__.py index 436bd48f7..11c6354cc 100644 --- a/electrum/gui/qml/__init__.py +++ b/electrum/gui/qml/__init__.py @@ -23,14 +23,14 @@ from electrum.i18n import set_language, languages from electrum.plugin import run_hook from electrum.util import profiler from electrum.logging import Logger -from electrum.base_crash_reporter import BaseCrashReporter, EarlyExceptionsQueue if TYPE_CHECKING: from electrum.daemon import Daemon from electrum.simple_config import SimpleConfig from electrum.plugin import Plugins + from electrum.wallet import Abstract_Wallet -from .qeapp import ElectrumQmlApplication +from .qeapp import ElectrumQmlApplication, Exception_Hook class ElectrumGui(Logger): @@ -95,37 +95,3 @@ class ElectrumGui(Logger): def get_default_language(self): name = QLocale.system().name() return name if name in languages else 'en_UK' - - - -class Exception_Hook(QObject, Logger): - _report_exception = pyqtSignal(object, object, object, object) - - _INSTANCE = None # type: Optional[Exception_Hook] # singleton - - def __init__(self, *, config: 'SimpleConfig', slot): - QObject.__init__(self) - Logger.__init__(self) - assert self._INSTANCE is None, "Exception_Hook is supposed to be a singleton" - self.config = config - self.wallet_types_seen = set() # type: Set[str] - - sys.excepthook = self.handler - threading.excepthook = self.handler - - self._report_exception.connect(slot) - EarlyExceptionsQueue.set_hook_as_ready() - - @classmethod - def maybe_setup(cls, *, config: 'SimpleConfig', wallet: 'Abstract_Wallet' = None, slot = None) -> None: - if not config.get(BaseCrashReporter.config_key, default=True): - EarlyExceptionsQueue.set_hook_as_ready() # flush already queued exceptions - return - if not cls._INSTANCE: - cls._INSTANCE = Exception_Hook(config=config, slot=slot) - if wallet: - cls._INSTANCE.wallet_types_seen.add(wallet.wallet_type) - - def handler(self, *exc_info): - self.logger.error('exception caught by crash reporter', exc_info=exc_info) - self._report_exception.emit(self.config, *exc_info) diff --git a/electrum/gui/qml/qeapp.py b/electrum/gui/qml/qeapp.py index cf915dead..bae850aba 100644 --- a/electrum/gui/qml/qeapp.py +++ b/electrum/gui/qml/qeapp.py @@ -15,7 +15,7 @@ from electrum import version, constants from electrum.i18n import _ from electrum.logging import Logger, get_logger from electrum.util import BITCOIN_BIP21_URI_SCHEME, LIGHTNING_URI_SCHEME -from electrum.base_crash_reporter import BaseCrashReporter +from electrum.base_crash_reporter import BaseCrashReporter, EarlyExceptionsQueue from electrum.network import Network from .qeconfig import QEConfig @@ -348,3 +348,35 @@ class ElectrumQmlApplication(QGuiApplication): if re.search('file:///.*TypeError: Cannot read property.*null$', file): return self.logger.warning(file) + +class Exception_Hook(QObject, Logger): + _report_exception = pyqtSignal(object, object, object, object) + + _INSTANCE = None # type: Optional[Exception_Hook] # singleton + + def __init__(self, *, config: 'SimpleConfig', slot): + QObject.__init__(self) + Logger.__init__(self) + assert self._INSTANCE is None, "Exception_Hook is supposed to be a singleton" + self.config = config + self.wallet_types_seen = set() # type: Set[str] + + sys.excepthook = self.handler + threading.excepthook = self.handler + + self._report_exception.connect(slot) + EarlyExceptionsQueue.set_hook_as_ready() + + @classmethod + def maybe_setup(cls, *, config: 'SimpleConfig', wallet: 'Abstract_Wallet' = None, slot = None) -> None: + if not config.get(BaseCrashReporter.config_key, default=True): + EarlyExceptionsQueue.set_hook_as_ready() # flush already queued exceptions + return + if not cls._INSTANCE: + cls._INSTANCE = Exception_Hook(config=config, slot=slot) + if wallet: + cls._INSTANCE.wallet_types_seen.add(wallet.wallet_type) + + def handler(self, *exc_info): + self.logger.error('exception caught by crash reporter', exc_info=exc_info) + self._report_exception.emit(self.config, *exc_info)