From 774c9353915f1b929e4a9c055ab2654c9c08c5d0 Mon Sep 17 00:00:00 2001 From: Tuomas Salo Date: Thu, 11 Apr 2013 17:01:43 +0300 Subject: [PATCH] In case of a non-pre-defined error, raise an AppError and give access to error.data --- jsonrpclib/__init__.py | 2 +- jsonrpclib/jsonrpc.py | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/jsonrpclib/__init__.py b/jsonrpclib/__init__.py index 6e884b8..86dbd27 100644 --- a/jsonrpclib/__init__.py +++ b/jsonrpclib/__init__.py @@ -3,4 +3,4 @@ from jsonrpclib.history import History history = History.instance() from jsonrpclib.jsonrpc import Server, MultiCall, Fault -from jsonrpclib.jsonrpc import ProtocolError, loads, dumps +from jsonrpclib.jsonrpc import ProtocolError, AppError, loads, dumps diff --git a/jsonrpclib/jsonrpc.py b/jsonrpclib/jsonrpc.py index e11939a..1e4619f 100644 --- a/jsonrpclib/jsonrpc.py +++ b/jsonrpclib/jsonrpc.py @@ -109,6 +109,9 @@ def jloads(json_string): class ProtocolError(Exception): pass +class AppError(ProtocolError): + def data(self): + return self[0][2] class TransportMixIn(object): """ Just extends the XMLRPC transport where necessary. """ @@ -526,7 +529,11 @@ def check_for_errors(result): if 'error' in result.keys() and result['error'] != None: code = result['error']['code'] message = result['error']['message'] - raise ProtocolError((code, message)) + if -32700 <= code <= -32000: + # pre-defined errors, see http://www.jsonrpc.org/specification#error_object + raise ProtocolError((code, message)) + else: + raise AppError((code, message, result['error'].get('data', None))) return result def isbatch(result):