Print python exception tracebacks

This commit is contained in:
miruka 2019-10-29 13:34:55 -04:00
parent 001d6eff71
commit 7a5a1fc650
3 changed files with 14 additions and 11 deletions

View File

@ -2,14 +2,15 @@ import asyncio
import logging as log import logging as log
import signal import signal
import sys import sys
import traceback
from concurrent.futures import Future from concurrent.futures import Future
from operator import attrgetter from operator import attrgetter
from threading import Thread from threading import Thread
from typing import Coroutine, Sequence from typing import Coroutine, Sequence
import nio
from appdirs import AppDirs from appdirs import AppDirs
import nio
import pyotherside import pyotherside
from . import __about__ from . import __about__
@ -62,14 +63,15 @@ class App:
def _call_coro(self, coro: Coroutine, uuid: str) -> None: def _call_coro(self, coro: Coroutine, uuid: str) -> None:
def on_done(future: Future) -> None: def on_done(future: Future) -> None:
result = exception = trace = None
try: try:
result = future.result() result = future.result()
exception = None
except Exception as err: except Exception as err:
result = None
exception = err exception = err
trace = traceback.format_exc().rstrip()
CoroutineDone(uuid, result, exception) CoroutineDone(uuid, result, exception, trace)
self.run_in_loop(coro).add_done_callback(on_done) self.run_in_loop(coro).add_done_callback(on_done)

View File

@ -50,6 +50,7 @@ class CoroutineDone(PyOtherSideEvent):
uuid: str = field() uuid: str = field()
result: Any = None result: Any = None
exception: Optional[Exception] = None exception: Optional[Exception] = None
traceback: Optional[str] = None
@dataclass @dataclass

View File

@ -13,7 +13,7 @@ function onAlertRequested() {
} }
function onCoroutineDone(uuid, result, error) { function onCoroutineDone(uuid, result, error, traceback) {
let onSuccess = py.pendingCoroutines[uuid].onSuccess let onSuccess = py.pendingCoroutines[uuid].onSuccess
let onError = py.pendingCoroutines[uuid].onError let onError = py.pendingCoroutines[uuid].onError
@ -22,8 +22,8 @@ function onCoroutineDone(uuid, result, error) {
let args = py.getattr(error, "args") let args = py.getattr(error, "args")
onError ? onError ?
onError(type, args, error) : onError(type, args, error, traceback) :
console.error(uuid + ": " + type + ": " + args) console.error("python:\n" + traceback)
} else if (onSuccess) { onSuccess(result) } } else if (onSuccess) { onSuccess(result) }