diff --git a/moulinette/__init__.py b/moulinette/__init__.py index 66c1bd0d..b4f2e06e 100755 --- a/moulinette/__init__.py +++ b/moulinette/__init__.py @@ -50,6 +50,17 @@ console = Console() # pretty traceback using rich traceback.install(show_locals=True, extra_lines=6) + +# nice helper function for common usecase +def _format_exception(): + with console.capture() as capture: + console.print_exception() + + return capture.get() + + +console.format_exception = _format_exception + # Package functions diff --git a/moulinette/interfaces/api.py b/moulinette/interfaces/api.py index 3a61939b..9973fc79 100644 --- a/moulinette/interfaces/api.py +++ b/moulinette/interfaces/api.py @@ -13,7 +13,7 @@ from geventwebsocket import WebSocketError from bottle import request, response, Bottle, HTTPResponse from bottle import abort -from moulinette import msignals, m18n, env +from moulinette import msignals, m18n, env, console from moulinette.actionsmap import ActionsMap from moulinette.core import MoulinetteError, MoulinetteValidationError from moulinette.interfaces import ( @@ -487,10 +487,8 @@ class _ActionsMapPlugin(object): except Exception as e: if isinstance(e, HTTPResponse): raise e - import traceback - tb = traceback.format_exc() - logs = {"route": _route, "arguments": arguments, "traceback": tb} + logs = {"route": _route, "arguments": arguments, "traceback": console.format_traceback()} return HTTPResponse(json_encode(logs), 500) else: return format_for_response(ret)