I\'m using ajax to improve user experience in my Django project. My concern here is how to respond error to browser properly. As far as I know, I can either:
In my opinion:
when my project starts, I always pre-add a module named errors
in top of folder structure, firstly, I will write a base Exception class which inherits from Exception
, then write out some common Exception classes like ObjectNotFound
, ValidationError
from my experience. When I think there should raise an exception in my code, I will use exceptions from this module, and when I find new kind of exception need to be handled, I will write a new exception in it.
Then it's the work for how to handle them. As you are using Django, it very easy to catch exceptions through a middleware, you can write something like this:
from youproject import errors
# categorize your exceptions
400_ERRORS = (errors.ValidationError, errors.ParametersMissing, )
403_ERRORS = (errors.AuthenticationError, )
404_ERRORS = (errors.ObjectNotFound, errors.ResourceNotExist, )
class ExceptionHandleMiddleware(object):
def process_exception(self, request, e):
# set status_code by category of the exception you caught
if isinstance(e, 400_ERRORS):
status_code = 400
elif isinstance(e, 403_ERRORS):
status_code = 403
elif isinstance(e, 404_ERRORS):
status_code = 404
else:
# if the exception not belone to any one you expected,
# or you just want the response to be 500
status_code = 500
# you can do something like write an error log or send report mail here
logging.error(e)
response_dict = {
'status': 'error',
# the format of error message determined by you base exception class
'msg': str(e)
}
if settings.debug:
# you can even get the traceback infomation when you are in debug mode
response_dict['traceback'] = traceback.format_exc()
# set header and return the response
....
The code above is a summary of how I do exception handle in my projects, in general, it's about accurate exception controling, proper exception categorizing, and of course 'Explicit is better than Implicit' philosophy.
===UPDATE===
When it comes to how to deal with the corresponding responses in ajax, you can use the new feature in jquery1.5 statusCode
:
$.ajax({
statusCode: {
404: function() {
alert('page not found');
}
}
});
from jquery documentation:
A map of numeric HTTP codes and functions to be called when the response has the corresponding code. For example, the following will alert when the response status is a 404