better jsonrpc error handling, thanks Mariano
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 1.99.7 (2012-03-12 15:27:08) dev
|
Version 1.99.7 (2012-03-12 15:30:27) dev
|
||||||
|
|||||||
@@ -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
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user