diff --git a/wsme/controller.py b/wsme/controller.py index 303dd6e..e445822 100644 --- a/wsme/controller.py +++ b/wsme/controller.py @@ -260,14 +260,15 @@ class WSRoot(object): def _format_exception(self, excinfo): """Extract informations that can be sent to the client.""" - if isinstance(excinfo[1], exc.ClientSideError): + error = excinfo[1] + if isinstance(error, exc.ClientSideError): r = dict(faultcode="Client", - faultstring=unicode(excinfo[1])) + faultstring=error.faultstring) log.warning("Client-side error: %s" % r['faultstring']) r['debuginfo'] = None return r else: - faultstring = str(excinfo[1]) + faultstring = str(error) debuginfo = "\n".join(traceback.format_exception(*excinfo)) log.error('Server-side error: "%s". Detail: \n%s' % ( diff --git a/wsme/exc.py b/wsme/exc.py index 033d30b..d3eb496 100644 --- a/wsme/exc.py +++ b/wsme/exc.py @@ -5,11 +5,9 @@ if '_' not in __builtin__.__dict__: class ClientSideError(RuntimeError): - def __unicode__(self): - return RuntimeError.__str__(self) - - def __str__(self): - return unicode(self).encode('utf8', 'ignore') + @property + def faultstring(self): + return str(self) class InvalidInput(ClientSideError): @@ -18,7 +16,8 @@ class InvalidInput(ClientSideError): self.value = value self.msg = msg - def __unicode__(self): + @property + def faultstring(self): return _(u"Invalid input for field/attribute %s. Value: '%s'. %s") % ( self.fieldname, self.value, self.msg) @@ -28,7 +27,8 @@ class MissingArgument(ClientSideError): self.argname = argname self.msg = msg - def __unicode__(self): + @property + def faultstring(self): return _(u'Missing argument: "%s"%s') % ( self.argname, self.msg and ": " + self.msg or "") @@ -38,7 +38,8 @@ class UnknownArgument(ClientSideError): self.argname = argname self.msg = msg - def __unicode__(self): + @property + def faultstring(self): return _(u'Unknown argument: "%s"%s') % ( self.argname, self.msg and ": " + self.msg or "") @@ -47,5 +48,6 @@ class UnknownFunction(ClientSideError): def __init__(self, name): self.name = name - def __unicode__(self): + @property + def faultstring(self): return _(u"Unknown function name: %s") % (self.name) diff --git a/wsme/tests/test_exc.py b/wsme/tests/test_exc.py new file mode 100644 index 0000000..42676f9 --- /dev/null +++ b/wsme/tests/test_exc.py @@ -0,0 +1,32 @@ +# encoding=utf8 + +from wsme.exc import * + + +def test_clientside_error(): + e = ClientSideError("Test") + + assert e.faultstring == "Test" + + +def test_invalidinput(): + e = InvalidInput('field', 'badvalue', "error message") + + assert e.faultstring == \ + u"Invalid input for field/attribute field. Value: 'badvalue'. " \ + "error message", e.faultstring + + +def test_missingargument(): + e = MissingArgument('argname', "error message") + + assert e.faultstring == \ + u'Missing argument: "argname": error message', e.faultstring + + +def test_unknownargument(): + e = UnknownArgument('argname', "error message") + + assert e.faultstring == \ + u'Unknown argument: "argname": error message', e.faultstring +