Python handle custom exception from java web service - python

I have a java web service and python client using suds. My server raises custom exceptions which I would like to handle in the python script. Is it possible to catch them or it always will be caught as suds.WebFault exception?

suds.WebFault has fault field that has information about fault.
except suds.WebFault, e:
print e.fault.faultstring
print e.document
You can have your program to analyze server custom exception from WebFault and create new exception class(es) for every specific server exception then catch suds.WebFault exception, read server exception details and raise your custom exception.
class MyException(suds.WebFault):
pass
def convertServerException(e):
if e.fault.faultstring == 'exception1':
return MyException()
#...add more exception handling cases here
#...
try:
#...make a WebService call
except suds.WebFault, e:
print e
print e.fault
raise convertServerException(e)

Related

Raising user defined exception when connecting to sqlite

Let's say that I want to connect to database but getting an error on connect. In most of examples what I found people catch basic Error exception. But it also will catch any other mistake. So, the question is, what should I do to raise different user defined exceptions? In other words, how to throw user defined exception instead of predefined exception?
Like this:
class MySpecificException(Exception):
print('Handle exception here:')
try:
1/0
except ZeroDivisionError as e:
print('error text')
raise MySpecificException('SpecificException')

psycopg2.Error isn't being caught in python try/except block

I am developing an application using django with a PostgreSQL database. The application is designed to be used within an organization, so user-supplied SQL requests need to be executed. To deal with the possibility of malformed SQL requests, the database calls are wrapped in a try/except block:
import psycopg2
...
def djangoView(request):
...
try:
result = DBModel.objects.raw(sqlQuery)
return getJSONResponse(result) #Serializes result of query to JSON
except psycopg2.Error:
pass #Handle error (no db requests are made)
However, when I make a request to the view with malformed SQL, I am greeted with a 500 internal server error. The stack trace reveals that the cause of the 500 is a ProgrammingError, which is a subclass of psycopg2.Error. However, the except statement doesn't catch it correctly.
Django wraps all database exceptions with exceptions from its django.db package.
A correct way to catch the Error is:
import django.db
...
except django.db.Error:
If you want to access the underlying database exception:
except django.db.Error as e:
dbException = e.__cause__ #Subclass of psycopg2.Error

Unit test: test not failing if using try-except

I am trying to execute post-failure operations; so I can gather info on the state of the system only if it fail.
So far, I did not find a solution that works. I did try to add a try-except and this works; but then the output of my test run is "success", which is totally wrong.
try:
self.assertFalse(x>1, "the test failed")
except Exception as e:
print(e)
# do other post failure actions
Since the exception is caught, I assume that the unit test class won't be involved in reporting the error, and this end up with the test not failing.
How do I "escalate" the failure at the same time to both the except section and the Unit test class?
You can re-raise the exception once you caught and recorded it:
try:
self.assertFalse(x>1, "the test failed")
except Exception as e:
print(e)
# do other post failure actions
raise
Note that you may and should be more specific about the error you are catching - in this case, you are looking for catching the AssertionError exception instead of the generic Exception.

Flask cannot raise HTTP exception after try catching Runtime error

When I try to raise a HTTP exception status code 400 it only prints the json error message on the browser but does not state HTTP/1.1 400 BAD REQUEST in the console like it is supposed to. The exception raising works for all other parts of my program but it doesn't work when I do it in a try-catch for a runtime error.
My exception handler is exactly this:
http://flask.pocoo.org/docs/0.11/patterns/apierrors/
my try-catch:
try:
// run some program
catch RuntimeError as e:
raise InvalidUsage(e.message, status_code=400)
You should use the abort function of flask, something like:
from flask import abort
#app.route("/some_route")
def some_route():
try:
# do something
except SomeException:
abort(400, "Some message")

Are all HttpError in python subclasses of IOError

In our code we catch IOError and log it before reraising. I am getting a "connection reset by peer", but nothing in the logs. Is "connection reset by peer" a subclass of IOError in python?
.....
File "/usr/lib/python2.5/httplib.py", line 1047, in readline
s = self._read()
File "/usr/lib/python2.5/httplib.py", line 1003, in _read
buf = self._ssl.read(self._bufsize)
error: (104, 'Connection reset by peer')
The stack trace you pasted looks like some Exception of class error with arguments (104, 'Connection reset by peer).
So it looks like it's not a HTTPError exception at all. It looks to me like it's actually a socket.error. This class is indeed a subclass of IOError since Python 2.6.
But I guess that's not your question, since you are asking about HttpError exceptions. Can you rephrase your question to clarify your assumptions and expectations?
Comment from usawaretech:
How are you finding out it is a socket
error? MY code is something like:
try:risky_code(); except IOError:
logger.debug('...'); raise; As I am
assuming that HttpError is a subclass
of IOError, when I get that exception,
I am assuming that it be logged. There
is nothing in my logs
I guess it is a socket.error because I used the index of the standard library documentation, and because I encountered this error before.
What version of Python are you using? I guess it's Python 2.5 or earlier.
If your intent is to log and re-raise exceptions, it would be a better idea to use a bare except:
try:
risky_code()
except:
logger.debug(...)
raise
Also, you can find the module where the exception class was defined using exception.__module__.

Categories

Resources