diff --git a/src/python/app.py b/src/python/app.py index 7d6a445e..0c9e9063 100644 --- a/src/python/app.py +++ b/src/python/app.py @@ -2,14 +2,15 @@ import asyncio import logging as log import signal import sys +import traceback from concurrent.futures import Future from operator import attrgetter from threading import Thread from typing import Coroutine, Sequence +import nio from appdirs import AppDirs -import nio import pyotherside from . import __about__ @@ -62,14 +63,15 @@ class App: def _call_coro(self, coro: Coroutine, uuid: str) -> None: def on_done(future: Future) -> None: - try: - result = future.result() - exception = None - except Exception as err: - result = None - exception = err + result = exception = trace = None - CoroutineDone(uuid, result, exception) + try: + result = future.result() + except Exception as err: + exception = err + trace = traceback.format_exc().rstrip() + + CoroutineDone(uuid, result, exception, trace) self.run_in_loop(coro).add_done_callback(on_done) diff --git a/src/python/pyotherside_events.py b/src/python/pyotherside_events.py index 3a7e88b3..86c2d649 100644 --- a/src/python/pyotherside_events.py +++ b/src/python/pyotherside_events.py @@ -50,6 +50,7 @@ class CoroutineDone(PyOtherSideEvent): uuid: str = field() result: Any = None exception: Optional[Exception] = None + traceback: Optional[str] = None @dataclass diff --git a/src/qml/event_handlers.js b/src/qml/event_handlers.js index 2d2f2a57..cff3e05d 100644 --- a/src/qml/event_handlers.js +++ b/src/qml/event_handlers.js @@ -13,7 +13,7 @@ function onAlertRequested() { } -function onCoroutineDone(uuid, result, error) { +function onCoroutineDone(uuid, result, error, traceback) { let onSuccess = py.pendingCoroutines[uuid].onSuccess let onError = py.pendingCoroutines[uuid].onError @@ -22,8 +22,8 @@ function onCoroutineDone(uuid, result, error) { let args = py.getattr(error, "args") onError ? - onError(type, args, error) : - console.error(uuid + ": " + type + ": " + args) + onError(type, args, error, traceback) : + console.error("python:\n" + traceback) } else if (onSuccess) { onSuccess(result) }