better jsonrpc error handling, thanks Mariano

This commit is contained in:
Massimo DiPierro
2012-03-12 15:30:29 -05:00
parent 1faf14105b
commit a29f189edc
3 changed files with 23 additions and 14 deletions
+1 -1
View File
@@ -1 +1 @@
Version 1.99.7 (2012-03-12 15:27:08) dev Version 1.99.7 (2012-03-12 15:30:27) dev
+11 -9
View File
@@ -15,7 +15,7 @@
__author__ = "Mariano Reingart (reingart@gmail.com)" __author__ = "Mariano Reingart (reingart@gmail.com)"
__copyright__ = "Copyright (C) 2011 Mariano Reingart" __copyright__ = "Copyright (C) 2011 Mariano Reingart"
__license__ = "LGPL 3.0" __license__ = "LGPL 3.0"
__version__ = "0.04" __version__ = "0.05"
import urllib import urllib
@@ -34,13 +34,12 @@ except ImportError:
class JSONRPCError(RuntimeError): class JSONRPCError(RuntimeError):
"Error object for remote procedure call fail" "Error object for remote procedure call fail"
def __init__(self, code, message): def __init__(self, code, message, data=None):
value = "%s: %s\n%s" % (code, message, '\n'.join(data))
RuntimeError.__init__(self, value)
self.code = code self.code = code
self.message = message self.message = message
def __unicode__(self): self.data = data
return u"%s: %s" % (self.code, self.message)
def __str__(self):
return self.__unicode__().encode("ascii","ignore")
class JSONDummyParser: class JSONDummyParser:
@@ -134,16 +133,19 @@ class ServerProxy(object):
self.error = response.get('error', {}) self.error = response.get('error', {})
if self.error and self.exceptions: if self.error and self.exceptions:
raise JSONRPCError(self.error.get('code', 0), self.error.get('message', '')) raise JSONRPCError(self.error.get('code', 0),
self.error.get('message', ''),
self.error.get('data', None))
return response.get('result') return response.get('result')
ServiceProxy = ServerProxy
if __name__ == "__main__": if __name__ == "__main__":
# basic tests: # basic tests:
location = "http://www.web2py.com.ar/webservices/sample/call/jsonrpc" location = "http://www.web2py.com.ar/webservices/sample/call/jsonrpc"
client = ServerProxy(location, verbose='--verbose' in sys.argv,) client = ServerProxy(location, verbose='--verbose' in sys.argv,)
print client.add(1, 2) print client.add(1, 2)
+11 -4
View File
@@ -17,6 +17,7 @@ import glob
import os import os
import re import re
import time import time
import traceback
import smtplib import smtplib
import urllib import urllib
import urllib2 import urllib2
@@ -3803,11 +3804,14 @@ class Service(object):
def return_response(id, result): def return_response(id, result):
return serializers.json({'version': '1.1', return serializers.json({'version': '1.1',
'id': id, 'result': result, 'error': None}) 'id': id, 'result': result, 'error': None})
def return_error(id, code, message): def return_error(id, code, message, data=None):
error = {'name': 'JSONRPCError',
'code': code, 'message': message}
if data is not None:
error['data'] = data
return serializers.json({'id': id, return serializers.json({'id': id,
'version': '1.1', 'version': '1.1',
'error': {'name': 'JSONRPCError', 'error': error,
'code': code, 'message': message}
}) })
request = current.request request = current.request
@@ -3827,7 +3831,10 @@ class Service(object):
return return_error(id, e.code, e.info) return return_error(id, e.code, e.info)
except BaseException: except BaseException:
etype, eval, etb = sys.exc_info() etype, eval, etb = sys.exc_info()
return return_error(id, 100, '%s: %s' % (etype.__name__, eval)) code = 100
message = '%s: %s' % (etype.__name__, eval)
data = request.is_local and traceback.format_tb(etb)
return return_error(id, code, message, data)
except: except:
etype, eval, etb = sys.exc_info() etype, eval, etb = sys.exc_info()
return return_error(id, 100, 'Exception %s: %s' % (etype, eval)) return return_error(id, 100, 'Exception %s: %s' % (etype, eval))