qml: crash handler, move Exception_Hook to qeapp.py
This commit is contained in:
@@ -23,14 +23,14 @@ from electrum.i18n import set_language, languages
|
|||||||
from electrum.plugin import run_hook
|
from electrum.plugin import run_hook
|
||||||
from electrum.util import profiler
|
from electrum.util import profiler
|
||||||
from electrum.logging import Logger
|
from electrum.logging import Logger
|
||||||
from electrum.base_crash_reporter import BaseCrashReporter, EarlyExceptionsQueue
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from electrum.daemon import Daemon
|
from electrum.daemon import Daemon
|
||||||
from electrum.simple_config import SimpleConfig
|
from electrum.simple_config import SimpleConfig
|
||||||
from electrum.plugin import Plugins
|
from electrum.plugin import Plugins
|
||||||
|
from electrum.wallet import Abstract_Wallet
|
||||||
|
|
||||||
from .qeapp import ElectrumQmlApplication
|
from .qeapp import ElectrumQmlApplication, Exception_Hook
|
||||||
|
|
||||||
class ElectrumGui(Logger):
|
class ElectrumGui(Logger):
|
||||||
|
|
||||||
@@ -95,37 +95,3 @@ class ElectrumGui(Logger):
|
|||||||
def get_default_language(self):
|
def get_default_language(self):
|
||||||
name = QLocale.system().name()
|
name = QLocale.system().name()
|
||||||
return name if name in languages else 'en_UK'
|
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)
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from electrum import version, constants
|
|||||||
from electrum.i18n import _
|
from electrum.i18n import _
|
||||||
from electrum.logging import Logger, get_logger
|
from electrum.logging import Logger, get_logger
|
||||||
from electrum.util import BITCOIN_BIP21_URI_SCHEME, LIGHTNING_URI_SCHEME
|
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 electrum.network import Network
|
||||||
|
|
||||||
from .qeconfig import QEConfig
|
from .qeconfig import QEConfig
|
||||||
@@ -348,3 +348,35 @@ class ElectrumQmlApplication(QGuiApplication):
|
|||||||
if re.search('file:///.*TypeError: Cannot read property.*null$', file):
|
if re.search('file:///.*TypeError: Cannot read property.*null$', file):
|
||||||
return
|
return
|
||||||
self.logger.warning(file)
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user