По моему мнению:
- второй метод неприемлем.
- он не потерпит неудачу, поскольку сервер все равно отправит ответ http.
- Пустья расскажу вам, что я делаю в своих проектах:
когда мой проект запускается, я всегда предварительно добавляю модуль с именем errors
в начало структуры папок, во-первых, я напишу базовый класс Exceptionкоторый наследует от Exception
, а затем выписать некоторые общие классы исключений, такие как ObjectNotFound
, ValidationError
из моего опыта.Когда я думаю, что в моем коде должно возникнуть исключение, я буду использовать исключения из этого модуля, и когда я обнаружу, что необходимо обработать исключение нового типа, я напишу в нем новое исключение.
Тогда эторабота для того, как справиться с ними.Поскольку вы используете Django, очень просто перехватывать исключения через промежуточное ПО, вы можете написать что-то вроде этого:
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
....
Приведенный выше код представляет собой сводку о том, как я обрабатываю исключения в моих проектах, в целом.речь идет о точном контроле исключений, правильной категоризации исключений и, конечно, философии «явное лучше, чем неявное».
=== ОБНОВЛЕНИЕ === Когда речь идет о том, как обращаться с соответствующими ответами в ajax,Вы можете использовать новую функцию в jquery1.5 statusCode
:
$.ajax({
statusCode: {
404: function() {
alert('page not found');
}
}
});
из документации jquery:
Карта числовых кодов HTTP и функций, вызываемых при ответеимеет соответствующий код.Например, следующее будет оповещать, когда статус ответа 404