En mi opinión:
- el segundo método no es aceptable.
- no fallará ya que el servidor aún enviará una respuesta http.
- Déjeme decirle lo que hago en mis proyectos:
cuando mi proyecto comienza, siempre antes de añadir un módulo denominado errors
en la parte superior de la estructura de carpetas, en primer lugar, voy a escribir una clase de excepción base que hereda de Exception
, luego escribe algunas clases de excepciones comunes como ObjectNotFound
, ValidationError
según mi experiencia. Cuando creo que debería aparecer una excepción en mi código, usaré excepciones de este módulo, y cuando encuentre que se debe manejar un nuevo tipo de excepción, escribiré una nueva excepción.
Entonces es el trabajo de cómo manejarlos. Como se está utilizando Django, es muy fácil de capturar las excepciones a través de un middleware, se puede escribir algo como esto:
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
....
El código anterior es un resumen de cómo lo hago mango excepción en mis proyectos, en general , se trata de control de excepciones precisas, categorización de excepciones adecuada y, por supuesto, la filosofía 'Explicit is better than Implicit'.
ACTUALIZACIÓN === === Cuando se trata de cómo hacer frente a las respuestas correspondientes en ajax, puede utilizar la nueva característica de jquery1.5 statusCode
:
$.ajax({
statusCode: {
404: function() {
alert('page not found');
}
}
});
de la documentación de jQuery :
Un mapa de códigos numéricos HTTP y funciones para llamar cuando la respuesta tiene el código correspondiente.Por ejemplo, lo siguiente será alerta cuando el estado de respuesta es un 404
Debe marcar una de las respuestas como correctas y adelantar las que le sirvieron. Es una buena práctica si tiene la intención de seguir usando este sitio, así como un buen gesto para aquellos que se tomaron el tiempo para responderle :) – Sid
@Sid Gracias por su amable guía :). Creo que mi pregunta no ha sido respondida (pero he elegido la mejor respuesta en este momento). Y realmente lo siento, pero mi reputación no es suficiente para un voto popular. – kavinyao
No tiene que elegir la mejor respuesta si su pregunta no ha sido completamente respondida. Lo siento, no fue mi intención apresurarte :) – Sid