Skip to content

Commit

Permalink
Add traceback data to error response when exceptions are raised
Browse files Browse the repository at this point in the history
  • Loading branch information
pipermerriam committed Sep 2, 2016
1 parent 5605dc5 commit 21d4ca7
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 10 deletions.
5 changes: 5 additions & 0 deletions jsonrpc/manager.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import sys
import traceback
import json
import logging
from .utils import is_invalid_params
Expand Down Expand Up @@ -113,6 +115,9 @@ def response(**kwargs):
"type": e.__class__.__name__,
"args": e.args,
"message": str(e),
"traceback": ''.join(
traceback.format_exception(*sys.exc_info())
),
}
if isinstance(e, TypeError) and is_invalid_params(
method, *request.args, **request.kwargs):
Expand Down
21 changes: 11 additions & 10 deletions jsonrpc/tests/test_manager.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import os
import sys
if sys.version_info < (2, 7):
import unittest2 as unittest
Expand Down Expand Up @@ -122,11 +123,11 @@ def test_server_error(self):
self.assertTrue(isinstance(response, JSONRPC20Response))
self.assertEqual(response.error["message"], "Server error")
self.assertEqual(response.error["code"], -32000)
self.assertEqual(response.error["data"], {
"type": "KeyError",
"args": ('error_explanation',),
"message": "'error_explanation'",
})
self.assertEqual(response.error["data"]['type'], "KeyError")
self.assertEqual(response.error["data"]['args'], ('error_explanation',))
self.assertEqual(response.error["data"]['message'], "'error_explanation'")
self.assertIn('traceback', response.error["data"])
self.assertIn(os.path.basename(__file__), response.error["data"]['traceback'])

def test_notification_calls_method(self):
request = JSONRPC20Request("long_time_method", is_notification=True)
Expand Down Expand Up @@ -155,11 +156,11 @@ def test_type_error_inside_method(self):
self.assertTrue(isinstance(response, JSONRPC20Response))
self.assertEqual(response.error["message"], "Server error")
self.assertEqual(response.error["code"], -32000)
self.assertEqual(response.error["data"], {
"type": "TypeError",
"args": ('TypeError inside method',),
"message": 'TypeError inside method',
})
self.assertEqual(response.error["data"]['type'], "TypeError")
self.assertEqual(response.error["data"]['args'], ('TypeError inside method',))
self.assertEqual(response.error["data"]['message'], 'TypeError inside method')
self.assertIn('traceback', response.error["data"])
self.assertIn(os.path.basename(__file__), response.error["data"]['traceback'])

def test_invalid_params_before_dispatcher_error(self):
request = JSONRPC20Request(
Expand Down

0 comments on commit 21d4ca7

Please sign in to comment.